Hallo Dennis,
Nutzer gibt "administrator" und "weißichnicht' OR 1 #" ein
--> "SELECT name, passwort FROM user WHERE user = '$username' AND passwort = '$password'"
--> SELECT name, passwort FROM user WHERE user = 'administrator' AND passwort = 'weißichnicht' OR 1 #'
Durch das OR 1 ist es egal was das Passwort ist, durch das # wird das nachfolgende ' als Kommentar betrachtet (sonst gäbe das nämlich noch einen MySQL-Error) und damit ist es dem Angreifer gelungen sich als administrator einzuloggen, ohne dem sein Passwort zu kennen.
Warum? Inwiefern? Ich überprüfe hübsch redundant (oder auch nicht)
-
ob die Abfrage genau einen Datensatz zurückliefert.
Wenn nicht, ist die Anmeldung fehlgeschlagen. -
ob bei dem zurückgelieferten Datensatz die Kombinationen
name aus Datensatz, name aus Eingabe
passwort aus Datensatz, passwort aus Eingabe (gern auch als Hash)
passen. Passen diese nicht, dann ist die Anmeldung fehlgeschlagen.
Selbstverständlich sollte man SQL-Injection von vornherein vermeiden. Eine gute Möglichkeit dazu sind der Einsatz von DB-Abstraktionsklassen, die es erlauben, Abfragen zu parametrisieren anstatt sie ad hoc als Zeichenkette zusammenzubauen. Baut man sein SQL-Statement als Zeichenkette zusammen, sollte man (im Falle von MySQL) mysql_real_escape_string() verwenden, dabei magic_quotes berücksichtigen, wie im Handbuch beschrieben.
Freundliche Grüße
Vinzenz