====== Datenbanksicherheit mit PHP ====== Beim Arbeiten mit Datenbanken muss man sich gegen verschiedene Angriffsmöglichkeiten wappnen. Zu den verbreitetsten zählen //SQL-Injections// (dt. //SQL-Einschleusungen//). Hierbei versucht der Angreifer SQL-Befehle als Parameter, die in die MySQL-Abfrage einfließen, zu übergeben. ===== SQL-Injection Beispiel ===== Um sich gegen Angriffe zu wehren, muss man die Methode verstehen. In diesem Beispiel geht es darum, dass völlig andere Befehle an das Ende eines über die GET-Methode übergebenen Parameters gehängt wird. Nehmen wir an, der User hat die id = 3. Die URL für diesen Code wäre dann vermutlich //dateiname.php?id=3//. Ein bösartiger Angreifer kann nun, da der Inhalt der Variable $_GET['id'] nicht auf seine Plausiblität geprüft wird, schadhaften Code anhängen: dateiname.php?id=3';+DELETE+FROM+user+WHERE+id+>+'0';-- Der SQL-Befehl, der ausgeführt wird, sieht also so aus: SELECT namen FROM user WHERE id = '3'; DELETE FROM user WHERE id > '0'--' In diesem Fall würden zusätzlich zum Auslesen des Namens des User mit der id=3 alle Datensätze, deren id größer als 0 ist, in der "user"-Tabelle gelöscht. Die beiden //- -// am Ende sind Kommentare in der SQL Sprache, vergleichbar mit doppelten Schrägstrichen in PHP oder C. Es werden alle nachfolgenden Zeichen, in diesem Fall der Rest der ursprünglichen Abfrage, also ein //'// ignoriert. ===== Gegenmaßnamen bei Integer-Variablen ===== Bei Integer-Variablen, also Variablen, die nur Zahlen enthalten sollten, wie in dem oberen Beispiel, ist die Abwehr recht einfach: Man muss die übergebene Variable in einen Integer-Wert umwandeln: Der Variable //$user_id// wird nun in jedem Fall der Integer-Wert des Variable //$_GET['id']// zugewiesen. Das Anhängen eines funktionierenden SQL-Befehls an den Parameter wird somit unmöglich. ===== Gegenmaßnamen bei String-Variablen ===== Bei String-Variablen stellt PHP eine bequeme Funktion zu Verfügung, die alle SQL-Befehle erkennt und unschädlich macht bzw. maskiert: //mysql_real_escape_string('string')//. ===== POST und GET im Vergleich ===== Sind nur GET-Variablen von dem unerwünschtem Verändern von Daten betroffen? Auf den ersten Blick kann es so aussehen, da man bei GET-Variablen nur die Adresszeile des Browsers verändern muss, doch auch POST-Variablen kann man mit den entsprechenden Tools (z.B. dem Firefox Addon [[https://addons.mozilla.org/en-US/firefox/addon/966|Tamper Data]]) verändern. Auch Cookies sind vom User veränderbar. In diesem Sinne: \\ **ALL INCOMING DATA IS EVIL**