Schutz vor SQL injection

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Schutz vor SQL injection

    Ich habe ein Anmeldeformular über 3 Seiten und benutze für die Variablen eine Session. Jetzt möchte ich durch einen Filter den Eintrag von gefährlichem Code in die MySQL Datenbank verhindern. Ich wollte jeweils am Anfang jeder Seite einen Filter einbauen.
    PHP Code:
    foreach($_POST as $key => $value) {
        
    $data[$key] = filter($value); 
    PHP Code:
    function filter($data) {
        
    $data trim(htmlentities(strip_tags($data)));
        
        if (
    get_magic_quotes_gpc())
            
    $data stripslashes($data);
        
        
    $data mysql_real_escape_string($data);
        
        return 
    $data;

    Frage 1: Kann ich anstelle der Post-Variable die von Code befreite Variable in eine Session anmelden? So klappt es ja nicht - Wie wäre die richtige Syntax?
    PHP Code:
    $_SESSION['Vorname'] = '$data[Vorname]'
    Frage 2: Oder ist es sinnvoller die Variablen so in die Session aufzunehmen
    PHP Code:
    $Vorname mysql_real_escape_string($_POST['Vorname']);
    $_SESSION['Vorname'] = $Vorname
    und dann den Filter erst auf der letzten Formularseite vor dem INSERT in die SQL Tabelle anzuwenden? Danke für alle Hinweise, ich bin noch Anfänger ;-)

  • #2
    Das ist hochgradiger Quatsch. Du mischt irgendwie lauter Funktionen, die nichts miteinander zu tun haben, zusammen und schreibst dadurch Müll in die Datenbank und in die Session.

    htmlentities() brauchst du überhaupt nicht.

    mysql_real_escape_string() _nur_ bei SQL-Abfragen verwenden.

    htmlspecialchars() _nur_ bei HTML-Ausgaben verwenden.

    Beides zusammen ergibt in der Regel keinen Sinn, außer du möchtest HTML-Code in die Datenbank schreiben, was aber eher ein Sonderfall ist.

    Für die Werte in der Session darf weder htmlentities() bzw. htmlspecialchars(), noch mysql_real_escape_string() verwendet werden.

    Also bevor du irgendeine Funktion von den genannten verwendest, solltest du erstmal überlegen: Was will ich eigentlich machen? Möchte ich den Wert in eine Datenbankabfrage einsetzen? Dann SQL-escapen. Möchte ich den Wert auf einer HTML-Seite ausgeben? Dann HTML-escapen. Möchte ich ihn in die Session speichern oder den Wert weiterverarbeiten? Dann muss er in seiner Reinform (ohne irgendein Escaping) vorhanden sein.
    Last edited by h3ll; 29-11-2011, 13:02.

    Comment


    • #3
      Im prinzip verstanden und etwas durcheinander gebracht. Allerdings ist der Filter, den ich da eingebaut habe sicher nicht ganz falsch, bevor ich alle Formularvariablen in die Datenbank einspiele? Ich werde dann auf den verschiedenen Formularseiten einfach nach dem Muster arbeiten.
      PHP Code:
      $Vorname $_POST['Vorname'];
      $_SESSION['Vorname'] = $Vorname

      Comment


      • #4
        Originally posted by anna28 View Post
        Im prinzip verstanden und etwas durcheinander gebracht. Allerdings ist der Filter, den ich da eingebaut habe sicher nicht ganz falsch, bevor ich alle Formularvariablen in die Datenbank einspiele?
        Zu 80% falsch. Also 20% richtig.

        Originally posted by anna28 View Post
        Ich werde dann auf den verschiedenen Formularseiten einfach nach dem Muster arbeiten.
        PHP Code:
        $Vorname $_POST['Vorname'];
        $_SESSION['Vorname'] = $Vorname
        Warum der Zwischenschritt über die Variable $Vorname?

        PHP Code:
        $_SESSION['Vorname'] = $_POST['Vorname']; 

        Comment


        • #5
          Warum eigentlich nicht. Hatte das bestimmt mal so irgendwo aufgeschnappt. Danke

          Comment


          • #6
            Originally posted by anna28 View Post
            Warum eigentlich nicht.
            Warum schon? Beschäftigungstherapie?

            Ich sag ja nicht, dass es falsch ist. Aber wozu die unnötige Variablenschieberei? Wenns dir Spaß macht, kannst du es ja gerne machen

            Comment


            • #7
              Ich meinte "warum eigentlich nicht" so wie Du es gezeigt hast ;-)

              Comment

              Working...
              X