SQL-Injections verhindern Zurück zur Übersicht
Über den Autor
Da diese Methode einen MySQL Server zu hacken sich im Moment wieder verbreitet, möchte ich Euch zeigen wie man mit einer einfachem Funktion Attacken auf den eigenen MySQL Server verhindern kann.
Unter SQL-Injections versteht man eine Attacke die zum Beispiel über "$_GET" oder "$_POST" eingeleitet wird. Als Beispiel nehme ich mal einen simplen Newscript, der auf einer seperaten Seite zusätzliche Informationen zeigt. Dabei wird die NewsID über "$_GET['newsid']" übergeben. Der passende Link dazu sieht so aus: "index.php?show=news&newsid=1"
"$_GET['newsid']" wird erst in einem SQL Befehl verarbeitet und bietet so eine wunderbare Möglichkeit Crackern eigene Befehle an zu hängen. Hier erst mal kurz der Code wie "$_GET['newsid']" verarbeitet wird:
PHP-Code:
<?php // News einlesen -> $sql = "SELECT Titel, Datum, Inhalt FROM news WHERE ".$_GET['newsid']." = ID"; ?>
Dies ist die denkbar schlechteste Variante "$_GET['newsid']" zu verarbeiten, da man schon mit einem Link wie "index.php?show=news&newsid=1 UNION SELECT 1,IF EXISTS(SELECT * FROM users WHERE username='root')BENCHMARK(100000000,MD5(1))" zum Beispiel, herausfinden kann ob der User "root" vorhanden ist. Dies ist leider aber nur der Anfang, da man über Injections auch auf bestimmte Dateien vom MySQL Server zugreifen kann, die man über das normale Web nicht erreichen würde. Diese Methoden werde ich Euch aber sicher nicht zeigen.
Aber wie verhindert man einen solchen Angriff? Das ist eigentlich recht einfach. Jedes Mal wenn Benutzereingaben in einem SQL-Befehl verarbeitet werden, müsst Ihr prüfen ob die Eingabe so aussieht, wie sie soll und zur Not wird sie einfach umgewandelt oder ein Fehler ausgegeben. Im Fall von der NewsID würde das so aussehen:
PHP-Code:
$id = (int)$_GET['newsid'];
Nun werden nur Zahlen in die Variable $id übergeben und der ganze Rest, fällt weg. Bei Eingaben mit Text (Emailadressen, etc.) empfiehlt sich ein REGEX, der die Eingabe überprüft und zur Not ein Fehler ausgibt. Beispiel gibt es zu Hauf im Netz. Bei guten Tutorials findet ihr auch immer passende Lösungen für die Überprüfung von Benutzereingaben.
Wichtig ist nur, das Ihr jede Eingabe die ein Benutzer machen kann auf Gültigkeit überprüft und NICHTS ungeprüft in die Datenbank schreiben lasst. Das Gleiche gillt natürlich auch beim lesen auf Basis von Benutzereingaben (dazu gehören auch Links, wie Oben).
Nachtrag am 1/11/2011: Sicheres Programmieren wird immer wichtiger. Das proaktive testen von möglichen Schwachstellen ist unabdingbar auf dem Weg zu einer sicheren Anwendung. Nur durch konsequent saubere Entwicklung sind spannende Einsatzfelder wie online sicher bezahlen (externer Link) überhaupt erst denkbar. Aber auch für private Homepages, Firmen und Verreine nimmt das Thema Sicherheit eine immer größere Bedeutung ein. Wer heute beginnt, eine Programmiersprache zu lernen, sollte sich auch gleich entsprechendes Security Know-How aneignen.