SQL Injections bei MySQL verhindern

fehlt wasgeht sogutsehr guthat geholfen (No Ratings Yet)
Loading ... Loading ...
Werbung




Bei jeder Übergabe von IDs oder ganzen Worten kann ein Angreifer bei nicht überlegter Programmierung SQL-Code einschleusen, der durch den Query mit ausgeführt wird und somit Schaden in den Datenbanken ausnutzt oder ganze Datenbanken löschen.

SQL Injektion, wie geht das?

Hier zum Beispiel eine Datenbankabfrage, die ein Angreifer ausnutzen könnte, um Injections auszuführen:

$sql = "SELECT * FROM sessionid WHERE sessionid='".$_GET['sessionid']."'";
$result = mysql_query($sql);

Solche Abfragen kommen in den meisten Programmierungen vor, die mit Mitgliedern arbeiten. Dort wird meistens mit SessionIDs gearbeitet. Allerdings ist dies auch nur eine Beispiel-Abfrage, sämtliche andere Abfragen, die eine Variable direkt in den Query aufnimmt, ist vor einem Angriff nicht sicher.

So lässt sich obige Abfrage mit einem simplen URL-Abfrage ausnutzen:

http://domain.tld/skript.php?sessionid=';DELETE FROM sessionid'

Dies würden dann im Skript die SQL-Abfrage folgenden Befehl ausführen:

SELECT * FROM sessionid WHERE sessionid=''; DELETE FROM sessionid'';

Diese Abfrage sind zwei zusammenhängende SQL-Abfragen. Zunächst würde der Datenbankserver den ersten Befehl ausführen und alle sessionid’s suchen, die leer sind. Diese Abfrage ist relativ uninteressant, die zweite Abfrage ist da dann schon interessanter. Dies ist eine Abfrage, die per URL übergeben wurde. Diese Abfrage löscht sämtliche sessionids aus der Datenbank. Dieses Beispiel wäre noch relativ harmlos, diese fehlerhafte Programmierung lässt sich natürlich auch für schlimmere Abfragen ausnutzen. Wie vermeiden?

Hier haben sich die Programmierer schon Gedanken gemacht und sich einen Befehl ausgedacht, der die Übergebenen Werte so bearbeitet, dass sie nicht mehr ausgeführt sondern als Bestandteil des Strings gesehen werden.

SQL Injection verhindern

Benutzen Sie mysql_real_escape_string() für Abfragen mit Strings: Dieser Befehl bearbeitet sämtliche Sonderzeichen mit Anführungszeichen, damit sie als Bestandteil des Strings gesehen werden und nicht als ausführbare Funktion.

Benutzen Sie intval() für Abfragen mit Zahlen: intval() prüft die Variable, ob tatsächlich eine Zahl übergeben wurde.

Korrekte Abfragen wären:

$sql = "SELECT * FROM sessionid WHERE sessionid='".mysql_real_escape_string($_GET['sessionid'])."'";
$result = mysql_query($sql);
$sql2 = "SELECT * FROM userdatenbank WHERE userid=".intval($_GET['userid']);
$result2 = mysql_query($sql2);


Werbung


2 Kommentare zu: SQL Injections bei MySQL verhindern

  1. admin sagt:

    Ja, es gibt unter anderem das PHPids.
    Dies behandelt _POST und _GET Variablen und filtert sie. Allerdings muss es sehr fein eingestellt werden, damit nicht auch normale Abfragen geblockt werden.

  2. tom sagt:

    gibt es nicht auch etwas, dass direkt auf dem webserver installiert werden kann? meine ich hätte mal von solch einer software gelesen. damit würden ebenfalls versuche abgefangen, unabhängig vom website-code.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>