Datenbank Injektion / SQL Injection

Was bedeutet das eigentlich und was kann man dagegen tun? Eine Datenbankabfrage basiert auf einer bestimmten Eingabe die über unsere Webseite gemacht werden kann. Wird diese Eingabe nicht richtig verarbeitet, bevor die Datenbankabfrage gemacht wird, ist es möglich die Datenbank so zu manipulieren.

Was sind Eingaben?

  • Parameter aus der Browserzeile
  • Texte / Bilder aus Eingabefeldern (Input oder Textarea)
  • Inhalte eines Cookies und einer Session

Wie lesen wir diese Inhalte aus?

  • $_GET
  • $_POST
  • $_FILE
  • $_COOKIE
  • $_SESSION

Was passiert genau?

Unsere Datenbankabfragen bauen darauf auf etwas auszulesen, was der Benutzer sehen möchte. Dafür möchten wir von diesem Wissen, was er sehen möchte und geben Ihm die Möglichkeit dies in ein Inputfeld einzugeben. Wir beziehen uns auf eine Suchanfrage, da diese sehr häufig verwendet wird, das Prinzip einer Datenbank Injektion ist aber immer gleich.

In unserer Datenbankabfrage wollen wir wissen, ob es einen Text gibt, der eine Bestimmte ID hat, sagen wir mal ID="1". Jetzt sieht unsere Datenbankabfrage so aus:

$query = "SELECT * FROM `table_beitraege` WHERE `id`='1'"

In unserem Beispiel geben wir "1" vor, aber wir wollen ja dass der Benutzer eingeben kann, was er sucht, dazu benötigen wir ein Inputfeld.

testet hier die Veränderung

$query = "SELECT * FROM `table_beitraege` WHERE `id`='".$_POST['input_suchen']."'"

Jetzt wird die Eingabe direkt in unsere Datenbankabfrage eingetragen, eigentlich reicht das ja auch um zu erfahren, ob es Beiträge gibt, mit der ID aus unserem Inputfeld. Jetzt gibt es aber auch Leute denen Langweilig ist, die nicht nur Zahlen, sondern auch andere Zeichen in dieses Inputfeld eintragen. Wenn wir jetzt ein Hochkomma oder doppeltes Hochkomma eintragen, verändert sich die Abfrage. Ein Datenbankfehler auf der Seite deutet darauf hin, dass etwas mit der Abfrage nicht stimmt. Hacker nutzen dies um die Abfrage zu Manipulieren.

Unsere Abfrage sieht jetzt so aus:

$query = "SELECT * FROM `table_beitraege` WHERE `id`='''"

Mit einem Hochkomma haben wir die Abfrage so verändert, dass ein Fehler angezeigt wird. Wenn wir jetzt alles erweitern und nicht nur das Hochkomma eintragen, sondern "1' OR `id`='2",

$query = "SELECT * FROM `table_beitraege` WHERE `id`='1' OR `id`='2'"

vervollständigen wir die Abfrage wieder ohne einen Fehler zu bekommen. Ohne das wir es wollen, werden jetzt zwei Beiträge ausgelesen, unser Beispiel bezieht sich nur auf die einfachste Möglichkeit zu Hacken, so lassen sich aber auch andere, meist Sichere Daten aus der Datenbank lesen, ohne dass wir das als Webseitenbetreiber wollen. zum Beispiel Daten die dem Datenschutz unterliegen E-Mail-Adressen, Kontoverbindungen und vieles mehr.

Damit dies nicht passiert, müssen wir unsere Übergabe aus dem Inputfeld ($_POST['input_suchen']) vor der Abfrage überprüfen, dies machen wir mit "mysql_real_escape_string" oder "quote", je nachdem welche Methode Ihr zum Abfragen nehmt.

$query = "SELECT * FROM `table_beitraege` WHERE `id`='".mysql_real_escape_string($_POST['input_suchen'])."'"

Mit "mysql_real_escape_string" machen wir folgendes alle Hochkommas und doppelten Hochkommas, versehen wir mit einem Backslash. Dies passiert automatisch und unsere Abfrage sieht dann so aus:

$query = "SELECT * FROM `table_beitraege` WHERE `id`='\''"
$query = "SELECT * FROM `table_beitraege` WHERE `id`='1\' OR `id`=\'2'"

Das Ergebnis der Abfrage ist in dem Fall kein Fehler mehr, sondern ein leeres Resultat und in der Ausgabe sollte stehen "Es wurde kein Text mit der ID ' gefunden" oder "Es wurde kein Text mit der ID 1' OR `id`='2 gefunden".

Kommentare

Kommentare können nur mit einer Verifizierten E-Mail-Adresse geschrieben werden, die E-Mail-Adresse muss einmal bestätigt werden.
@
(success)