Hallo David,
ich versteh irgendwie dein Problem nicht, sorry.
Wenn du eine Abfrage als String zusammensetzt (einer der Gründe, warum man das nach Möglichkeit vermeiden sollte), dann füllt PHP Variablen ein:
"SELECT name, passwort FROM user WHERE name = '$user' AND passwort = '$passwort'"
Szenario 1:
Nutzer gibt "test" und "test" ein
--> "SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'test'"
--> eine syntaktisch korrekte Abfrage die genau den/die Sätze liefert, auf die das zutrifft
Szenario 2:
Nutzer gibt "test" und "te"st" ein (äußere Quotes nur zur Verdeutlichung)
2.1: Das " ist als " maskiert
--> "SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te"st'"
--> eine syntaktisch korrekte Abfrage die genau den/die Sätze liefert, auf die das zutrifft
2.2: Das " ist nicht maskiert, da $passwort mit ' begrenzt ist
hmh, das fällt mir im Moment schwer zu raten was da passiert. Wenn PHP das tatsächlich einfüllt, dann käme da
"SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te"st'"
raus
--> ungültiger String, Syntaxfehler, aber ich glaube soweit kämst du nicht
Szenario 3a, und hier wirds eigentlich interessant
Nutzer gibt "test" und "te'st" ein
ohne Escapen ergibt das
--> "SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te'st'"
--> das ist für PHP ein gültiger String, aber MySQL findet
SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te'st'
und das ist nicht richtig gequotet
Szenario 3b:
"test" und "te''st"
--> "SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te''st'"
--> für MySQL:
SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'te''st'
Hier stimmt zwar die Anzahl der Quotes, aber ... AND passwort = 'te' ist fertig, das 'st' steht alleine in der Luft --> Syntax-Error
Szenario 3c
"test" und "test' OR 1=1"
--> "SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'test' OR 1=1"
--> PHP sagt OK, MySQL kriegt
SELECT name, passwort FROM user WHERE user = 'test' AND passwort = 'test' OR 1=1
--> und genau hier ist der Hund begraben:
AND bindet stärker als OR, die Datenbank versucht also auszuwerten:
user='test' AND passwort='test' -> liefert Ergebnis oder eben nicht
ODER
1=1 -> alle Datensätze erfüllen diese Bedindung
--> Ergebnis der Abfrage sind also alle name, passwort
Hilft das?
MfG
Rouven
-------------------
ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|