Über Bobby Tables und SQL-Einschleusung
Warum hat Bobbys Schule ihre Daten verloren?
Die Schule hat anscheinend die Namen der Schüler in einer Tabelle namens Students gespeichert. Wenn sich ein neuer Schüler anmeldet, fügt die Schule seinen Namen zur Tabelle hinzu. Der dazugehörige Code könnte etwa so ausschauen:
$sql = "INSERT INTO Students (Name) VALUES ('" . $studentName . "');";
execute_sql($sql);
Die erste Zeile erzeugt einen String mit einem SQL-INSERT-Anweisung. Der Inhalt der Variable $studentName wird in die SQL-Anweisung eingefügt. Die zweite Zeile schickt die erzeugte SQL-Anweisung an die Datenbank. Die Falle in diesem Code ist, dass Daten von außerhalb, d.h. der Inhalt von $studentName, Teil der SQL-Anweisung werden.
Wir betrachten zunächst, wie die SQL-Anweisung aussieht, wenn wir einen Schüler namens John hinzufügen:
INSERT INTO Students (Name) VALUES ('John');
Das ergibt genau, was wir wollen: John wird der Tabelle Students hinzugefügt.
Jetzt fügen wir Klein Bobby Tables hinzu, indem wir $studentName den Wert Robert'); DROP TABLE Students;-- zuweisen. Die SQL-Anweisung lautet:
INSERT INTO Students (Name) VALUES ('Robert'); DROP TABLE Students;--');
Dies fügt Robert der Tabelle Students hinzu, jedoch folgt der INSERT-Anweisung eine DROP-TABLE-Anweisung, die die gesamte Tabelle entfernt. Autsch!
Wie man Bobby Tables vermeidet
Man kann Bobby-Tables-Angriffe nur vermeiden,
- indem man keine SQL-Anweisungen erstellt, die von außen kommende Daten enthalten.
- indem man SQL-Aufrufe mit Parametern tätigt.
Das ist alles. Nicht versuchen, ungültige Zeichen zu maskieren. Nicht versuchen, es eigenhändig zu machen. Lerne, parameterisierte Anweisungen zu benutzen, und zwar immer und jedes Mal.
Im Comic wird eine Sache falsch gemacht. Die Antwort lautet nicht, die Datenbankeingaben selber zu bereinigen. Dies ist fehleranfällig.
