Sicherheit des Skripts

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Sicherheit des Skripts

    Hallo,

    nachdem nun das nötigste soweit läuft wie es soll geht es darum das Ganze sicher zu machen. Ein großes Thema sind ja die SQL-Injections.
    Das erste Skript, das ich draufhin mal überarbeitet habe ist dieses hier:

    PHP-Code:
    <?php
    //Passwortabfrage für Terminänderungen

    echo "<div id='inhalt'>";

    if(isset(
    $_POST["absenden"]))
    {
     if((
    $_POST['name'] != "") AND ($_POST['passwort'] != ""))
     {
      
    //ü im Namen in ein ue wandeln
      
    $suche = array ("ü");
      
    $ersatz = array ("ue");
      
    $aname str_replace ($suche$ersatz$_POST['name']);

      
    // Verbinden mit der Datenbank
      
    require_once($root "/functions/db_connection.php");
     
      
    //Prüfen ob eingegebene Daten korrekt sind 
      
    $query "SELECT name, passwort FROM pws WHERE name = '" mysql_real_escape_string($aname) . "'";
      
    $result mysql_query($query);
      if(!
    $result)
      {
       die(
    'Ungültige Abfrage: ' mysql_error());
      }
      while(
    $row mysql_fetch_assoc($result))
      {
       if ((
    $aname == $row['name']) AND ($_POST['passwort'] == $row['passwort']))
       {
        echo 
    "<meta http-equiv='Refresh' content='0; URL=index.php?ziel=eintragen&name=" $row['name'] . "' />"
       }  
       else 
       {
        echo 
    "<p><fehler>Benutzername und/oder Passwort falsch. Bitte Eingaben prüfen !</fehler><p>";
       }
      }
     }
     else 
     {
      echo 
    "<p><fehler>Kein Benutzername und/oder Passwort eingetragen. Bitte eingeben.</fehler><p>";
     }

    //Eingabeformular erzeugen
    echo "<form action='index.php?ziel=pweintrag' method='post' enctype='multipart/form-data'>"
    echo 
    "<label for='vorname'>Benutzername: </label>";
    echo 
    "<input type='text' name='name' id='name'><br /><br />"
    echo 
    "<label for='passwort'>Passwort: </label>";
    echo 
    "<input type='password' name='passwort' id='passwort'><br /><br />"
    echo 
    "<input type='submit' name='absenden' value='Einloggen' />";
    echo 
    "</form>";
    echo 
    "</div>";
    ?>
    Nun mal die Frage an euch, in wie weit ist das Skript vom SQL her sicher ist. Was sollte man noch tun um das, bzw. Skripte im allgemeinen, sicher zu machen?


    Danke !


    Gruß

    Michael
    Gruß

    Michael

  • #2
    Was sollte man noch tun um das, bzw. Skripte im allgemeinen, sicher zu machen?
    Skripte nicht posten wo sie jeder analysieren kann

    mysql_real_escape_string ist natürlich schonmal eine Grundlage. Um Skripte allgemein sicher zu halten gehört viel lesen dazu. Immer täglich verfolgen ob irgendwelche Sicherheitslücken auftauchen oder ähnliches.

    mfg
    bugbuster
    tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
    documentation: php.net mysql.com framework.zend.com

    Die Nachtwache!

    Kommentar


    • #3
      Naja ich hätte da allgemein ein paar Fragen:

      1. zur Sicherheit. Wenn ich als User dieses Script ausführe und ich mich richtig eingeloggt habe, wird diese Seite geladen:

      PHP-Code:
      index.php?ziel=eintragen&name=Schnitzel 
      Doch was passiert dann wenn ich

      PHP-Code:
      index.php?ziel=eintragen&name=Admin 
      eingebe?

      Ich würde, den Eingeloggten Usernamen in einer PHP Session speichern und dann irgendwelche Informationen über den User immer daraus holen! Sonst kann der User ja selber bestimmen wer er eigentlich ist.

      2. Dann würde ich Passwörter in der Datenbank immer MD5 verschlüsselt speichern.

      3. Du hast diese Abfrage drin:

      PHP-Code:
      ($aname == $row['name']) 
      Vertraust du etwa MySQL nicht, dass es dir nur Einträge sendet, bei dem der Name in der Datenbank steht? Denn genau nach dem filterst du ja.

      4. Hast du dir schon mal überlegt was passiert wenn ein Username mehrmals in der Datenbank vorhanden ist? Wenn z.b. der erste User der sich in der Datenbank befindet nicht das gleiche Passwort hat wie der User in der Form eingeben hat, zeigt das Script dir ein Error an, obwohl vieleicht an einer anderen Stelle der Username mit dem eingegebenen Passwort stimmen würde.

      5. Warum ersetzt du nur ü mit ue? was ist mit ä und ö?

      Viele Anregungen, nicht nur wegen der Sicherheit =)

      Ach ja:

      Original geschrieben von Bugbuster
      Skripte nicht posten wo sie jeder analysieren kann
      Glaubst du etwa an Security through obscurity ?!? (http://de.wikipedia.org/wiki/Security_through_obscurity)
      Das finde ich dann doch ziemlich gefährlich als Tipp für einen Beginner...

      Kommentar


      • #4
        Nein, ich glaube an Skriptkiddies.

        Das finde ich dann doch ziemlich gefährlich als Tipp für einen Beginner...
        Deute erstmal meinen Smilie
        tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
        documentation: php.net mysql.com framework.zend.com

        Die Nachtwache!

        Kommentar


        • #5
          Auf keinen Fall als alleiniges Sicherheitsmerkmal betrachten, aber dennoch sehr nützlich: Das PHP Intrusion Detection System!

          Ansonsten als Lektüre zu empfehlen: http://www.bsi.de/literat/studien/websec/WebSec.pdf

          @Schnitzel: Wenn du dich an Bugbusters scherzhaften Kommentar aufhängst, solltest du auch mal deine eigene Nase abtasten: MD5 stellt keine Verschlüsselung dar. Das halte ich gegenüber Anfängern für ein noch viel größeres Missverständnis.
          Zuletzt geändert von unset; 18.03.2008, 11:41.
          [FONT="Helvetica"]twitter.com/unset[/FONT]

          Shitstorm Podcast – Wöchentliches Auskotzen

          Kommentar


          • #6
            - Passwörter per md5 zu verschlüsseln macht durchaus Sinn

            - es kann keine doppelten User geben, da der Personenkreis der sich dort anmeldet überschaubar ist. In diesem Fall.

            - ($aname == $row['name']) ist doppelt gemoppelt, das stimmt. Da reicht es auch nur auf's richtige Passwort zu prüfen.

            - ö und ä brauche ich in diesem Fall nicht zu ersetzen, da er nicht auftreten kann. Im Allgemeinen sollte man natürlich alle drei Fälle abdecken.

            - das Thema Sessions werde ich dann als nächstes einfügen, zusammen mit den Passwörten über md5

            Zumindest habe ich jetzt schon mal einen Ansatz, was noch an Lücken zu schliessen ist.


            Gruß

            Michael
            Gruß

            Michael

            Kommentar


            • #7
              - Passwörter per md5 zu verschlüsseln macht durchaus Sinn
              md5 ist keine Verschlüsselungsfunktion sondern eine Hashfkt
              - es kann keine doppelten User geben, da der Personenkreis der sich dort anmeldet überschaubar ist. In diesem Fall.
              Ein UNIQUE auf die Spalte Username und die DB sorgt selber dafür, dass keine doppelten Usernamen vorkommen
              - ö und ä brauche ich in diesem Fall nicht zu ersetzen, da er nicht auftreten kann. Im Allgemeinen sollte man natürlich alle drei Fälle abdecken.
              Mit dem richtigen Zeichensatz ist es kein Problem auch Umlaute in der Tabelle zu speichern
              - das Thema Sessions werde ich dann als nächstes einfügen...
              Unbedingt solltest du das tun!

              Gruss

              tobi
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Ob nun Verschlüsselung oder Hashfkt. Auf alle Fälle nicht mehr Klartext.

                Ein UNIQUE auf die Spalte Username bringt's natürlich auch und ich muss nicht lange die DB befragen ob es den user schon gibt. Die FM dazu (state 1062) gibt sie dann ja automatisch zurück. Somit müsste der User, solange einen Namen für sich wählen, bis er einen findet der noch nicht in der DB steht. Machst sicherlich einfacher.

                Mit welchem Zeichensatz kann ich denn Umlaute in der DB speichern?? Im phpMyAdmin gibt es ja unmengen an möglichen Zeichensätzen.
                Das Sktript an sich hat utf8.

                Begebe mich dann man an die Sessions.


                Gruß

                Michael
                Gruß

                Michael

                Kommentar


                • #9
                  Mit welchem Zeichensatz kann ich denn Umlaute in der DB speichern??
                  Und wusste nix dazu? Also UTF 8 kann das bestimmt...
                  Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                  [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                  Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                  Kommentar


                  • #10
                    Habt ihr ein gutes nützliches Tut zum Thema Sessions? Ich hab mal gegoogelt, aber da finde ich ca. ne Million Einträge. Da dann rauszufinden was was taugt dauert drei Tage. Vielleicht könnt ihr mir ja auf nem kürzeren Weg was an dei Hand geben.


                    Danke !


                    Michael
                    Gruß

                    Michael

                    Kommentar


                    • #11
                      Original geschrieben von fritzje610
                      Habt ihr ein gutes nützliches Tut zum Thema Sessions?
                      http://tut.php-quake.net/sessions.html

                      Ich halte btw MD5 mit einem salt für eine ausreichende Verschlüsselung für Passwörter in einer Datenbank.

                      Kommentar


                      • #12
                        Nochmal zu den Zeichensätzen. In der Datenbank stehen Namen mit Umlauten, die von einem Skript korrekt eingetragen werden.

                        Wenn ich nun mit diesem Skript mir den Namen ausgeben lassen will, der den Umlaut enthält bekomme ich keine Ausgabe. Alles anderen Namen werden in der while-Schleife angezeigt.
                        Ich finde aber meinen Fehler nicht. Die DB nutzt

                        # MySQL-Zeichensatz: UTF-8 Unicode (utf8)
                        # Zeichensatz / Kollation der MySQL-Verbindung: utf8_general_ci

                        Habt ihr nen tip für mich ?!?!


                        Gruß

                        Michael


                        PHP-Code:
                        <?php
                        //Passwortabfrage für Terminänderungen

                        if(isset($_POST["absenden"]))
                        {
                          echo 
                        $_POST['name'];
                         
                        // Verbinden mit der Datenbank
                         
                        require_once($_SERVER['DOCUMENT_ROOT']  . "/functions/db_connection.php");
                         
                         
                        //Prüfen ob eingegebene Daten korrekt sind 
                         
                        $query "SELECT name, passwort FROM pws WHERE name = '" mysql_real_escape_string($_POST['name']) . "'";
                         
                        $result mysql_query($query);
                         if(!
                        $result)
                         {
                          die(
                        'Ungültige Abfrage: ' mysql_error());
                         }
                         while(
                        $row mysql_fetch_assoc($result))
                         {
                          echo 
                        $row['name'];
                         } 

                        //Eingabeformular erzeugen
                        #echo "<form action='index.php?ziel=pweintrag' method='post' enctype='multipart/form-data'>"; 
                        echo "<form action='auslesen.php' method='post' enctype='multipart/form-data'>";
                        echo 
                        "<label for='vorname'>Benutzername: </label>";
                        echo 
                        "<input type='text' name='name' id='name'><br /><br />"
                        echo 
                        "<input type='submit' name='absenden' value='Einloggen' />";
                        echo 
                        "</form>";
                        echo 
                        "</div>";
                        ?>
                        Gruß

                        Michael

                        Kommentar


                        • #13
                          Versuch mal

                          PHP-Code:
                          // Verbinden mit der Datenbank
                           
                          require_once($_SERVER['DOCUMENT_ROOT']  . "/functions/db_connection.php");
                          mysql_query("SET CHARACTER SET utf8");

                          //usw 
                          gruss Chris

                          [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

                          Kommentar


                          • #14
                            Wenn ich die while Schleife um ein foreach erweitere zeigt es die Umlaut-Namen plötzlich an. Nur warum verstehe ich nicht ?

                            PHP-Code:
                             while($row mysql_fetch_assoc($result))
                             {
                              foreach (
                            $row as $value)
                              {
                               echo 
                            $value;
                              }
                             } 
                            Warum gibt er bei dieser Ausgabe die Namen mit Umlauten raus und bei der vorigen Schleife nicht ??? Gibts da ne Erklärung für???


                            Danke !

                            Zuletzt geändert von fritzje610; 18.03.2008, 20:41.
                            Gruß

                            Michael

                            Kommentar


                            • #15
                              Ich versteh jetzt gar nichts mehr. Ich habs nochmal zurückgeändert auf die while-Schleife alleine und plötzlich gehts. Ich raffs net. Kann man sowas erklären ???


                              Danke !
                              Gruß

                              Michael

                              Kommentar

                              Lädt...
                              X