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:

Zitat<?php
$sql = "INSERT
INTO users (reg_username,
reg_password,
reg_email)
VALUES ('{$_POST['reg_username']}',
'$reg_password',
'{$_POST['reg_email']}')";
?>

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:

Zitatbad_guy', 'mypass', ''), ('good_guy

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:
Zitat<?php
$sql = "INSERT
INTO users (reg_username,
reg_password,
reg_email)
VALUES ('bad_guy', 'mypass', ''), ('good_guy',
'1234',
'example@example.com')";
?>

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()

Netzwerke

Blogroll