Teil 5: SQL-Injection: So schützen Sie Ihre Webserver vor Hackerangriffen
- SQL-Injection: So schützen Sie Ihre Webserver vor Hackerangriffen
- Teil 2: SQL-Injection: So schützen Sie Ihre Webserver vor Hackerangriffen
- Teil 3: SQL-Injection: So schützen Sie Ihre Webserver vor Hackerangriffen
- Teil 4: SQL-Injection: So schützen Sie Ihre Webserver vor Hackerangriffen
- Teil 5: SQL-Injection: So schützen Sie Ihre Webserver vor Hackerangriffen
- Teil 6: SQL-Injection: So schützen Sie Ihre Webserver vor Hackerangriffen
In der Zwischenzeit hat auch die sehr populäre MySQL-Datenbank mit der MySQLi-Erweiterung Prepared Statements dazugelernt. Manche Web-Programmierer zögen allerdings, auf die aktuellste PHP-Version 5.3 und MySQL-Version 5.1 umzusteigen, weil sie eben die mysqli-Erweiterung mit sich bringt und eine ...
In der Zwischenzeit hat auch die sehr populäre MySQL-Datenbank mit der MySQLi-Erweiterung Prepared Statements dazugelernt. Manche Web-Programmierer zögen allerdings, auf die aktuellste PHP-Version 5.3 und MySQL-Version 5.1 umzusteigen, weil sie eben die mysqli-Erweiterung mit sich bringt und eine Aktualisierung der Skripte erfordert, die für MySQL 3.22 bis 5.0 entstanden sind.
Ab PHP 5.1 sollten für Datenbankabfragen bevorzugt PHP Data Objects (PDO) verwendet werden, eine PHP-Erweiterung, die eine Datenbankschnittstelle bereitstellt. Das folgende Beispiel illustriert den Einsatz von PHP Data Objects für Datenbankabfragen:
$dbh->exec("INSERT INTO REGISTRY
(name, value) VALUES (".$dbh->quote($name,PDO::PARAM_STR).", ".$dbh->quote($value,PDO::PARAM_INT).")");
und als Prepared Statement:
$stmt = $dbh->prepare("INSERT INTO
REGISTRY (name, value)VALUES (:name, :value)");
$stmt->bindParam('name', $name);
$stmt->bindParam('value', $wert);
Bei Datenbanktreibern, die Prepared Statements nicht unterstützen, kann die PDO-Erweiterung Prepared Statements emulieren.
Typumwandlung von Übergabeparametern
Eine weitere Möglichkeit zum Abschirmen des Datenbankservers bietet die Typumwandlung von Übergabeparametern, wie in dem folgenden Beispiel:
WHERE spalte2 = " .
intval($_POST['spalte2Wert']);
$query = mysql_query($abfrage) or
die("Die Datenbank konnte nicht abgefragt werden! ");
Scheinsicherheit: MDd5-Hashes
Der Einsatz des MD5-Algorithmus zum Kodieren des verwendeten Datenbankpassworts bietet nicht die benötigte Sicherheit. Denn zum einen kann der Code heute ohne übermäßigen Aufwand gebrochen werden und zum anderen lässt sich die Passwortabfrage mit etwas Geschick ganz umgehen, wenn die Eingabe nicht gefiltert wird.
MD5 steht für Message Digest Algoritm 5 und ist eine breit eingesetzte kryptografische Hash-Funktion mit einem 128-Bit-Hash-Wert. Leider bietet dieser mittlerweile in die Jahre gekommene MD5-Algorithmus nur noch unzureichenden Schutz.
$password_hash =
md5($_POST['passwort']);
$sql = "SELECT count(*)
FROM usersWHERE benutzername = '{$_POST['benutzername']}'AND passwort = '$passwort_hash'";
Bereits ganz gewöhnliche PCs sind heutzutage mit mehreren Kernen bestückt und so ist Rechenleistung in hinreichend großem Umfang erschwinglich geworden. Darüber hinaus lässt sich nicht nur die CPU, sondern auch die GPU - mit passender Software - zum Dekodieren von MD5-Hashes missbrauchen.

Dass es sich dabei nicht nur um eine theoretische Möglichkeit handelt, hat die HPC-Users-Group (High-Performance-Cluster) aus New York City bewiesen. Eines ihrer Mitglieder, Mario Juric, hat ein Tool zum Decodieren von MD5-Hashes auf einer GPU geschrieben. Nutzt man eine Nvidia-8800-Ultra-Grafikkarte, so beschleunigt sich die MD5-Hash-Berechnung im Vergleich zu einem Intel Q6700 @ 2,66 GHz um den Faktor 36.
Im Vergleich zu einem gleich getakteten Intel Quad-Core ist die GPU immer noch 9 x schneller. Und als ob das noch nicht genug wäre, kann man auch MD5-Hashes im Internet unter abfragen.
Kombiniert der Hacker eine stumpfe Brute-Force-Attacke mit dem geschickten Einsatz von Wörterbüchern und MD5-Hash-Datenbanken, so ist der MD5-Algorithmus leider kein wirkliches Hindernis mehr.
Während sich die Komplexität des MD5- Algorithmus mit der Zeit nicht verändert, nimmt dagegen jedoch die Leistungsstärke von GPUs in Grafikkarten und CPUs ständig zu, was bedeutet, dass der MD5-Algorithmus - zumindest in der jetzigen Form, die in PHP 4.x und 5.x eingebaut ist, auf verlorenem Posten steht.
Die Salt-Routine
Die Zeit ist natürlich nicht stehen geblieben und wer auch heute noch sicherstellen möchte, dass ein Passwort den eigentlichen Zweck erfüllt, sollte es mit der "salt"-Routine schützen. Eine mögliche Umsetzung sieht zum Beispiel wie folgt aus:
$salt = "EineSuperLangeNichtZu
ErratendeTextzeichenketteSchuetztVorUnsicherenPasswoertern";
$benutzerpasswort =
$POST['passwort'];
$md5pass = md5($salt .
$benutzerpasswort);
Sicherheits-Tipp: Unix-Anwender (einschließlich BSD, Linux, Mac OS X und Solaris) können mittels chroot einen Prozess in einem Verzeichnis gefangen nehmen, um zu verhindern, dass er Daten in anderen Verzeichnissen überschreiben kann.