Nicht nur unsere selbst erstellten PHP-Skripte, sondern auch die dahinterliegenden Datenbankserver mit den Datenbanken sind zu schützen. Sicherlich ist es immer wieder nötig, Variablen aus Formularen oder URLs in ein SQL-Kommando zu übernehmen. Beispielsweise muss, wenn ein Benutzer sich einloggt und die Benutzerdaten in der SQL-Datenbank liegen, eine SQL-Abfrage nach dem Passwort gestartet werden:
1 |
SELECT passwort FROM benutzertabelle WHERE benutzer='$_GET["benutzer"]' |
Dies sieht zunächst einmal nicht wie an Angriffsziel aus. Allerdings, wenn bedacht wird, dass für die Variable benutzer
aus dem Netz beliebiger Inhalt eingesetzt kann, könnte der Angreifer folgendes in diese Variable einfügen:
benutzer = "‘; DROP DATABASE
benutzerdatenbank
;
Dies hat den Effekt, dass die komplette SQL-Abfrage nach dem Einfügen der sehr merkwürdig aussehenden Variablenbelegung wie folgt zusammengestellt worden ist:
1 |
SELECT passwort FROM benutzertabelle WHERE benutzer='';DROP DATABASE `benutzerdatenbank`;’ |
Ein neues SQL-Kommando ist unberechtigt eingeschleust worden, welches bei der Ausführung unsere vollständige Datenbank löscht. Auch Anführungszeichen vor und hinter der Variable haben diesen Angriff nicht abwehren können. Die dazwischen geschobene Variable schließt die Variable mit dem einfachen Anführungszeichen einfach zunächst ab, bevor die eigene Anfrage angehängt wird.
Gegen diese Art der Attacke hilft wiederum eine restriktive Prüfung des übergebenen Strings. Alternativ lassen sich auch mit der Methode mysqli_real_escape_string()
bösartige Strings mit Anführungszeichen verändern, so dass alle Anführungszeichen escaped sind und damit nicht auf Kommandoebene, sondern auf Variableebene betrachtet werden. Ein einfaches Escapen von gefährlichen Zeichen mit addslashes()
reicht jedoch nicht aus.