SQL-Injection

Teil 5: 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 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.

Sicherheit

© Archiv

Wer eine Datenbank-Bibliothek mit Unterstützung für gebundene Parameter und Platzhalter wie zum Beispiel PEAR::DB, PDO einsetzt, kann sich über zusätzliche Sicherheit freuen.

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.

Mehr zum Thema

HTML5: Quick Reference Guide
Ratgeber: "HTML5"

Die wichtigsten Tags auf einen Blick: In unserem praktischen Arbeitsblatt finden Sie einen wertvollen Begleiter für die Umstellung Ihrer Webprojekte…
internet, webdesign, google, content, ranking, seo, suchmaschine
Ratgeber: Urheberrecht

Einzigartige Inhalte bieten Lesern Mehrwert und sind ein wichtiges Qualitätsmerkmal. Ärgerlich, wenn sich jemand durch Kopieren an fremden…
Die besten HTML5-Tipps
Neue Tipps & Tricks für blitz.io

Wer die Leistung einer Applikation ermitteln möchte, braucht keine Skripte zu schreiben, sondern kann einen der zahlreichen Online-Dienste…
image.jpg
Ratgeber: Webentwicklung

Die clientseitige Javascript-Entwicklung bietet fast keine Entwicklungsumgebungen und auch keine vernünftigen Werkzeuge zur Fehlersuche. Eine der…
internet, webdesign, meteor, webapplikationen
Ratgeber

Mit Meteor sollen Entwickler in kurzer Zeit Umgebungen für Webapplikationen erstellen können, ohne sich um lästige Details kümmern zu müssen. Wir…