Jetzt noch ein bisschen Erklärung nach dem Warum.
Wie Nevi schon richtig gesagt hat, wird mysql_query() ein String, also eine Zeichenkette übergeben. Das kann man auf der Website von php nachlesen. Genauer:
http://de.php.net/mysql_query
Code:
resource mysql_query ( string $query [, resource $link_identifier ] )
D.h. mysql_query(), die Funktion hat zwei Parameter. Der erste ist verpflichtend und ist vom Datentyp string, also eine Zeichenkette. Zu dem gibt es einen optionalen Parameter, der ein resource ist. Was das genau macht, lässt sich auf der Seite nachlesen. Zu dem gibt mysql_query() etwas mit dem Datentyp resource zurück. Was es genau zurückgibt, lässt sich auch nachlesen auf der Seite.
Es ist oft von der Logik unerlässlich den Rückgabewert (return value) zu verarbeiten. Oft aber auch nicht. Dennoch ist es ein besserer Stil, wenn man versucht die Fehler so früh wie möglich selber zu behandeln.
Nun zu dem SQL.
Das Insert-Query geht nach einem Schema vor (
http://dev.mysql.com/doc/refman/5.1/en/insert.html). Dabei werden Zeichenketten in Anführungszeichen bzw. Quotes angegeben, damit es keine Verwechslungen gibt.
Deswegen war auch das Schema interessant, um zu sehen welchen Datentyp die einzelnen Spalten haben.
Bei dem fiktiven Schema:
Code:
+------ score_data ------+
+-- id --+-- score --+-- name --+
+-- INT --+-- INT --+-- TEXT --+
Wäre es ein valides Query z.B.:
Code:
INSERT INTO score_data (score, name) VALUES (139, "Bla, Foo")
Hier sieht man auch, dass die Anführungszeichen Probleme verursachen würden. Da es sonst lauten würde
Code:
INSERT INTO score_data (score, name) VALUES (139, Bla, Foo)
Da die alten Datenbankfunktionen (mysql_*) noch recht tief sind, muss man somit noch recht viel arbeit selber erledigen. Die Textersetzung funktioniert also bei Datenbankquerys genau so, wie sonst auch.
Code:
$foo = "bla";
$bla = "bla";
print $foo.$bla; //"foo"."bla" => "foobla"
Bei einem Query entsprechend.
Code:
$var1 = "var1";
$var2 = "var2";
$query = "SELECT myvar, yourvar FROM vars WHERE myvar = '$var1' AND yourvar = '$var2'"; // SELECT myvar, yourvar FROM vars WHERE myvar = 'var1' AND yourvar = 'var2'
Neben den "alten" mysql_* Funktionen hat PHP mit PEAR auch abstraktere Bibliotheken. Wie z.B.
MDB2.
Ach zu dem Escapen wollte ich noch was schreiben. Wenn man nun das obrige Beispiel nimmt.
Code:
$query = "SELECT myvar, yourvar FROM vars WHERE myvar = '$var1' AND yourvar = '$var2'";
Könnte es sein, dass ein Angreifen, die $var2 mit dem Inhalt
' OR 5=5 UNION SELECT 'foo', deingeheimespasswort FROM meinegeheimepasswoerter /* an das Script schickt. Somit wäre das Query:
Code:
SELECT myvar, yourvar FROM vars WHERE myvar = 'var1' AND yourvar ='[color=red]' OR 5=5 UNION ALL SELECT 'foo', deingeheimespasswort FROM meinegeheimepasswoeter /*[/color]'
Das wäre ein gültiges Query und somit hätte der Angreifer dein Passwort. Je nach dem, wie die Datenbank administriert wurde, kann man sogar das Passwort der Datenbank herausfinden und somit hat man Vollzugriff. Daher merkt man sich:
All input data is evil!