MySQL Injection - Strings werden abgekappt, dadruch injection möglich?

  • Hi,
    mir ist gerade folgendes aufgefallen:

    Eine Tabelle users:

    Code
    id (INT) | name(VARCHAR)
    ---------+---------------
    1        | Hugo
    ---------+---------------
    2        | Bernd
    ---------+---------------

    Jetzt werden folgende queries ausgeführt:

    SQL
    SELECT name FROM users WHERE id='foo'


    Ich erhalte kein ergebnis, klar.

    SQL
    SELECT name FROM users WHERE id='1foo'


    Jetzt bekomme ich datensatz 1 "Hugo"

    Theoretisch macht das ja keinen sinn, weil "1foo" (string) nie im leben das gleiche ist wie 1(zahl).
    Muss ich mir da jetzt gedanken wegen SQL-Injections machen?

    Thnx und Grüße, Tobse

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Als Programmierer solltest du wissen, was für Datentypen in der DB vorhanden sind. Also solltest du im Script auch auf Typ prüfen, besonders dann, wenn die Werte von außen in das Script kommen.

  • Welche datentypen es sind weiss ich, klar.
    Das mit den intval() is ja grade das problem, denk ich. Normalerweise mach ich immer $id=(int) $id und überprüfe dann, obs 0 ist. Ichd achte gerade nur, wenn die datenbanke einfach erkennt, dass ein string kein int sein kann und mir n leeres ergebnis giebt, kann ich mir n haufen boilerplatecode ersparn.

    Und ausserdem kann ich dann auch n bissl mehr flapsig sein beim programmiern.

    Aber thnx für die hilfe ;)

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Naja, wenn das usereingaben sind (das "1foo") dann musst du ja so oder so immer escapen. Also ein mysql_real_escape_string() ist ja Plicht, aber bei der ID kannst du dir das sparen durch das explizite Typecasting intval() oder (int). (escape string ist ja logischerweise auch eigentlich nur für strings)