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:
Um MySQL-Injection zu vermeiden, sollte man alle Sonderzeichen, die an eine Datenbank übergeben werden, maskieren.
Beispiel:
$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);
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.