werbeklaus: Was alles ersetzt mysql_real_escape_string()?

Hallo,
Ich habe eine Frage zu Sicherheit mit Usereingaben in MySQL-Anfragen:

Ich habe schon mehrmals gelesen, dass man, wenn man Usereingaben in eine MySQL-Anfrage setzen will, mann immer die mysql_real_escape_string()-Funktion verwenden soll, um es sicher zu machen.

Ich habe die Funktion getestet und gemerkt, dass worte wie DELETE nicht "escaped" werden. Muss ich das danach auch noch prüfen? Oder ist es nicht möglich, als User Einen SELECT Befehl durch eine Eingabe bösartig zu machen?

Beispiel:
SELECT * FROM tabelle WHERE spalte='$Usereingabe'
Wenn der User nun etwas eingibt wie

"bla'; DELETE * FROM tabelle WHERE '1'='1"

Dann kommt raus

SELECT * FROM tabelle WHERE spalte='bla';
DELETE * FROM tabelle WHERE '1'='1'

Ist soas in der theorie möglich?

  1. Hallo,

    Ich habe die Funktion getestet und gemerkt, dass worte wie DELETE nicht "escaped" werden.

    Muss ja auch gar nicht. Denn sofern du bei den SQL Abfragen nicht schlampig warst, passiert da nichts.

    Beispiel:
    SELECT * FROM tabelle WHERE spalte='$Usereingabe'
    Wenn der User nun etwas eingibt wie

    "bla'; DELETE * FROM tabelle WHERE '1'='1"

    Dann kommt raus

    SELECT * FROM tabelle WHERE spalte='bla';
    DELETE * FROM tabelle WHERE '1'='1'

    Ist soas in der theorie möglich?

    Nein.

    1. mysql_query(); sendet immer nur __eine__ Anweisung an die DB. Die zweiter Anweisung (DELETE...), würde nicht an die DB gesendet werden.

    2.
    <?php
    $usereingabe = mysql_real_escape_string($eingabe);
    mysql_query("SELECT * FROM tb WHERE username = '$username';");
    ?>

    Wenn der User jetzt z.B. folgendes sendet:
    test' OR 1=1

    Dann würde das durch das mysql_real_escape_string(); so aussehen:
    SELECT * FROM tb WHERE username = 'test' OR 1=1';

    Dabei wurde das ' maskiert, und somit wird jetzt nach dem Username "test' OR 1=1" gesucht.

    mysql_real_escape_string() ruft die MySQL Bibliotheksfunktion mysql_escape_string auf, diese stellt den folgenden Zeichen einen Backslash voran: NULL, \x00, \n, \r, , ', " und \x1a.

    MFG
    Andavos

  2. Hallo werbeklaus,

    Ich habe die Funktion getestet und gemerkt, dass worte wie DELETE nicht "escaped" werden. Muss ich das danach auch noch prüfen?

    Natürlich, woher soll PHP wissen dass du DELETE in deiner Query gar nicht haben willst obwohl du es reinschreibst...

    Oder ist es nicht möglich, als User Einen SELECT Befehl durch eine Eingabe bösartig zu machen?

    Nicht, wenn du alle Benutezreingaben ordentlich validierst.

    Ist soas in der theorie möglich?

    Auch in der Praxis.

    Ein paar Links:
    http://php.net/mysql-real-escape-string
    12.11. Prüfe importierte Parameter. Traue niemandem
    16.18. Wie kann ich bösartigen Code in SQL-Abfragen unterbinden?

    Grüße
      David

    --
    >>Nobody will ever need more than 640k RAM!<<
    1981 Bill Gates