SQL-Injection

  • Hallo

    Ich habe 2 MySQL Scripts und möchte mich dabei vor SQL-Injectoins schützen.

    Ich hab auch 2 Links über diesem Thema, was ich jedoch nicht ganz verstehe:
    http://phpforum.de/forum/showthread.php?t=218433
    http://de.wikipedia.org/wiki/SQL-Injection#PHP

    Was ich weiss, ist daß ich irgendetwas escapen soll ... nur was und wie genau scheint mich irgendwie zu irritieren.

    So sehen meine Scripts aus:

    Script1.php

    Script2.php

  • Hier mal ein Beispiel fürs erste Script:

    mysql_real_escape_string()
    html_entities()
    ctype_alnum()
    ctype_digit()
    addslashes()

    sind einige von vielen die man benutzen sollte/kann!

    Gruß crAzywuLf :D

    2 Mal editiert, zuletzt von crAzywuLf (14. Mai 2009 um 16:37)

  • ok danke, es gibt aber 2 sachen die ich dabei nicht ganz verstehe:

    1. Wozu das '@' hinter mysql?

    2. Was ist mit mysql_real_escape_string() gemeint? Was ich herausfinden konnte, ist das beim Verwenden von mysql_real_escape_string() folgende Zeichen deaktiviert werden:
    \x00
    \n
    \r
    \
    '
    "
    \x1a

    Ist das so wie ich es verstanden habe richtig oder liege ich da falsch?

  • 1. @ vor einer Funktion zu schreiben unterdrückt Fehlermeldungen, die von der Funktion selber ausgeworfen werden.

    2. Das ist richtig. Diese Zeichen können benutzt werden, um eine SQL-Injektion durchzuführen.
    [Einschub: Würde die Query einfach 'SELECT `username`, `email` FROM `table` WHERE `id` = $id' ohne einfache Anführungsstriche um $id lauten, kämen wir als Angreifer sogar ohne diese Zeichen aus.]

    Da wir die $_GET['id'] bereits nach Integer, also in eine Ganzzahl, konvertiert haben, ist mysql_real_escape_string an dieser Stelle sogar überflüssig. Allerdings sollte es für $username bzw $email verwendet werden.

    Information will frei verfügbar sein.

    Don't eat unpeeled hedgehogs.

  • Vielleicht sollte ich das Beim SQL-Injection-Artikel aufnehmen:
    Wenn escapet wird, braucht man die einfachen Anführungszeichen.
    Bei intval etc. ist dies nicht nötig.
    Schau dir einfach mal die Beispiele an, und du siehst, wie ein Query von einem Cracker verändert werden kann.

    Übrigens deaktiviert mysql_real_escape_string keine Zeichen, sondern fügt vor ihnen Backslashes (\) ein. Somit werden sie von MySQL als einfache Zeichen behandelt.

    Edit:
    Habs im Artikel aufgenommen.

  • Danke für eure Hilfe. Ich schätze ich habe einiges dazu gelernt.