Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

SQL-Injections vermeiden - Das kann doch nicht so schwer sein

1mysql_query("SELECT * FROM table WHERE id = " . $_GET["id"]);

Das ist schlichtweg der Albtraum für jeden, der sich schonmal mit Sicherheit in Datenbankanwendungen beschäftigt hat.

Die unsichere Verwendung von HTTP-Paramtern, oder generell von Daten, die vom Benutzer kommen, stellt eine große Gefahr für die Sicherheit eines ganzen Systems dar. Mittels eines SQL-Injection Angriffes kann meist auf die gesamten Daten der Datenbank zugegriffen und dort zum Beispiel Passwörter gestohlen werden.

Comic

In diesem Beispiel kann man an die zugehörige URL http://site.com/article.php?id=56 auch noch ein zweiter Datenbankbefehl angehängt werden, denn die ID des Eintrages wird nicht überprüft: http://site.com/article.php?id=56;SELECT...

Die einfachste Lösung besteht darin einfach den PHP-Befehl mysql_real_escape_string() zu verwenden, und damit die Daten in der Abfrage zu filtern. Schon durch diesen einfachen Befehl ist es nahezu unmöglich die Website durch diesn Angriff zu übernehmen.

1mysql_query("SELECT * FROM table WHERE id = " . mysql_real_escape_string($_GET["id"]));

Leider ist diese Erkenntnis nicht sehr weit verbreitet. So musste ich erst heute eine politische Partei in meiner Umgebung vor ihrer eigenen Website warnen, da hier eine offensichtliche und leicht zu erkennende Sicherheitslücke besteht.

Später würde man wohl auf böse Hacker verweisen, die mit ihren hochkomplexen und auf keinen Fall vorhersehbaren Methoden Webseiten angreifen, die man einfach nicht besser schützen kann.

Gerade in Zeiten mit Werkzeugen wie sqlmap ist es ein leichtes solche Angriffe durchzuführen, wenn man auch nur etwas Ahnung von der Materie hat.

Update: Heute ist der 11.09.2012 und die besagte Lücke besteht noch immer. Anscheinend besteht auf Seiten der FPÖ keinerlei Interesse daran Hackerangriffe abzuwehren.