Schutz vor SQL injection

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

  • 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.
    Zuletzt geändert von h3ll; 29.11.2011, 13:02.

    Kommentar


    • #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

      Kommentar


      • #4
        Zitat von anna28 Beitrag anzeigen
        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.

        Zitat von anna28 Beitrag anzeigen
        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']; 

        Kommentar


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

          Kommentar


          • #6
            Zitat von anna28 Beitrag anzeigen
            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

            Kommentar


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

              Kommentar

              Lädt...
              X