SQL-Injektionen
Sich gegen SQL-Injektionen abzusichern ist eigentlich relativ einfach - dennoch ist es eine der beliebtesten Angriffsmethoden bei Software-Projekten.
Als Beispiel das folgende SQL-Statement:
Im Query wird $_POST verwendet, was immer sofort misstrauisch stimmen sollte. Man stelle sich nun vor, diese Abfrage würde einen neuen Account anlegen. Der User gibt einen Benutzernamen und eine E-Mail-Adresse vor. Die Registrierung hat ein temporäres Passwort erzeugt und dem User zugemailt, damit dieser es bestätigt.
Nun stelle man sich vor, der Benutzer hat folgendes als Usernamen angegeben:
Selbstverständlich ist nicht, was man einen "Usernamen" nennen würde, doch wenn keine Filterung der Daten stattfindet, erkennt die Anwendung das nicht. Wenn nun eine gültige E-Mail-Adresse angegeben wird und 1234 ist das erzeugte Passwort, sieht das SQL-Kommando nun wie folgt aus:
Anders als die ursprünglich vorgesehene Aktion (Erzeugung eines temporären Accounts) werden nun zwei verschiedene Accounts angelegt, wobei der "bad_Guy" alle seine Daten selber platzieren konnte.
Dieses Beispiel an sich ist noch nicht so tragisch, doch sollte nun klar sein, welche Gefahr darin liegt, wenn ein Benutzer selber SQL-Queries verändern kann. So kann man, je nach eingesetzter Datenbank, unter Umstände mehrere Anfragen auf einmal platzieren - oder durch ein geschickt gesetztes Semikolon die eigentliche Abfrage deaktivieren und eine eigene einbauen.
mySQL erlaubt erst in den neueren Versionen mehrere Abfragen
gleichzeitig, seit Version 4 wird das berüchtigte "UNION" unterstützt.
Unter PHP steht mit mysqli eine Erweiterung zur Verfügung, die mehrere
Abfragen gleichzeitig zulässt - aber nur wenn Sie mysqli_multi_query()
nutzen und nicht mysqli_query() Der Ratschlag ist
klar: Auf diese Möglichkeit verzichten um somit einzugrenzen, welches Potential einem Hacker zur Verfügung steht.
Schutz gegen SQL-Injection ist einfach umzusetzen:
- Daten filtern
Man kann es nicht oft genug sagen: Eine gute Filterung ist der beste Ausschluss von Sicherheitslücken - Anführungszeichen als Maskierung nutzen
Sofern möglich setzen Sie alle Werte in einfache Anführungszeichen - Escaping nutzen
Bevor externe Daten in SQL-Queries platziert werden, eine Funktion nutzen um Sonderzeichen zu maskieren. Etwa mysql_escape_string() oder notfalls addslashes()