sql-injection

SQL-Injection

Als SQL-Injection bezeichnet man eine Angriffsart, bei welcher man durch unzureichende Überprüfung von Benutzerdaten, SQL-Befehle einschleusen kann, was wiederum weitreichende Folgen nach sich zieht. So wäre es z. B. möglich, Datensätze auszulesen, zu ändern oder zu löschen, ohne das es vom Betreiber der Webseite beabsichtigt ist.

Findet man eine solche Schwachstelle in einer PHP-Anwendung, z. B. bei einem Login Formular, könnte man sich so Zugang zur Webseite verschaffen.

Würde man nun in das Eingabefeld für den Benutzernamen folgendes eingeben: admin' /*', ergibt sich folgende MySQL-Abfrage:

mysql_query("SELECT ∗ FROM users WHERE username = ′admin′ ⁄∗′ AND password=′&prime ");
Somit wäre die Authentifizierung ausgehebelt, da das /* das Kommentarzeichen bei MySQL ist. Alles was hinter diesen Kommentarzeichen steht ist nicht mehr relevant für die MySQL Abfrage. Das einfache Ausführungszeichen nach dem Kommentarzeichen schließt das MySQL-Statement ab.

Um MySQL-Injection zu vermeiden, sollte man alle Sonderzeichen, die an eine Datenbank übergeben werden, maskieren.

Beispiel:

if( get_magic_quotes_gpc () ){

         $username = stripslashes($_POST['username']);
         $kommentar = stripslahes($_POST['kommentar']);

}else{

         $username = $_POST['username'];
         $kommentar = $_POST['kommentar'];

}


$sql = 'INSERT INTO users (`username`,`kommentar`) VALUES
("'.mysql_real_escape_string($username).'",
"'.mysql_real_escape_string($kommentar).'");

mysql_query($sql);
Mit get_magic_quotes_gpc() überprüfen wir zuerst, ob magic_quotes auf on oder auf off gesetzt ist. Wenn ja, wird automatisch ein Backslash an ", ' und NULL gesetzt. Mit der Funktion stripslashes() kann man die Wirkung von magic_quotes rückgängig machen.

Im SQL-Statement kommt nun die Funktion mysql_real_escape_string() zum Einsatz. Diese entschärft sämtliche Sonderzeichen, die für einen SQL-Injection Angriff nützlich währen. Deswegen sollte man vor der Verwendung von mysql_real_escape_string() die Auswirkungen von magic_qoutes zurücksetzten, da nicht alle Sonderzeichen die "schädlich" sind von magic_qoutes maskiert werden und mysql_real_escape_string() die eingefügten Backslashs erneut maskieren würde.

Möchten man die Funktion mysql_real_escape_string() verwenden, ist eine Verbindung zur Datenbank erforderlich.

Bei Numerischen Werten ist eine Behandlung mit mysql_escape_string() nicht unbedingt erforderlich. Solche Werte sollten vor der Übergabe an eine Datenbank in den entsprechenden Wert (Integer, Float etc) umgewandelt werden.

Schlüsselwort-Filterung gehört auch zu einer der Abwehrmöglichkeiten von SQL-Injections. Schlüsselworte wie SELECT,UNION,AND,OR und ORDER sollten nach Möglichkeit gefiltert werden. Allerdings ist hier Vorsicht, geboten da Schlüsselworte im Feldinhalten erhalten sein können.