O'Reilly logo

PHP-Sicherheit: PHP/MySQL-Webanwendungen sicher programmieren by Stefan Esser, Christopher Kunz

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

1636.3 Authentifizierungssicherheit
Die oben stehenden Skripte erfüllen natürlich nicht alle Sicherheits-
und Funktionsansprüche und sollen Ihnen nur als Vorlage für eine
eigene Implementierung dienen. Das vom Benutzer neu zu wählende
Passwort sollte insbesondere den in den vorigen Abschnitten erwähn-
ten Kriterien genügen, um Sicherheitsprobleme zu minimieren.
Auch bei dieser Methode der Passwortänderung steht eines fest:
Ein Angreifer kann die E-Mail mit dem Challenge-Code abfangen und
statt des eigentlichen Empfängers das Passwort ändern. Dieser wird
jedoch davon erfahren, da er entweder die Mail gar nicht erst
bekommt und misstrauisch wird oder nach einem Klick auf den Chal-
lenge-Link die Mitteilung erhält, dass die Challenge-ID bereits ungül-
tig ist, weil das Passwort schon geändert wurde.
6.3 Authentifizierungssicherheit
6.3.1 Falsche Request-Methode
Sie sollten bei Login-Formularen stets und ausschließlich auf die
Request-Methode POST zurückgreifen. Zum einen können Sie so viele
Angriffe wie z.B. präparierte Links mit XSS-Attacken von vornherein
ausschließen, zum anderen vermeiden Sie die unabsichtliche Veröffent-
lichung von Informationen. Schließlich wird der komplette Query-
String im Webserver-Log mitgeschrieben, und Auswertungs- und Sta-
tistiksoftware könnte diesen Query-String an einer für andere Benutzer
zugänglichen Stelle veröffentlichen. Ein weiteres Problem stellen Web-
proxies dar, die – unter Umständen völlig transparent, also für den
Nutzer nicht feststellbar – sämtliche GET-Anfragen zwischenspei-
chern. POST-Requests hingegen werden grundsätzlich nicht in Webca-
ches abgelegt.
Richtige Superglobals
benutzen!
Zusätzlich zur geeigneten Wahl der Request-Methode sollten Sie
stets die superglobale Variable
$_POST benutzen und sich nicht auf das
vermeintlich bequemere
$_REQUEST verlassen. Denn auch wenn das
eigentliche Login-Formular die Methode POST verwendet, Sie aber in
Ihrer Validierungsroutine eine Variable aus
$_REQUEST abfragen (und
eventuell anzeigen), so kann ein Angreifer auch per GET Werte an Ihr
Formular übergeben.
Diese Nachlässigkeit hat bereits bei einigen PHP-basierten
Anwendungen zu teilweise kritischen Sicherheitslücken geführt, etwa
bei dem Servermonitoring-Tool »cacti«
11
, das zwar umfangreiche
Sicherheits- und Säuberungsaktionen für die in
$_GET enthaltenen Vari-
11. http://www.cacti.net/
6 Authentisierung und Authentifizierung 164
ablen durchführte, allerdings im weiteren Verlauf des Skripts die Vari-
able
$_REQUEST abfragte. Durch eine manipulierte POST-Anfrage
konnte der Angreifer nun ungehindert einen Login durchführen, ohne
über die notwendigen Rechte zu verfügen.
6.3.2 Falsche SQL-Abfrage
Üblicherweise werden für Login-Formulare ein Benutzername (häufig
die E-Mail-Adresse) und ein Passwort abgefragt, die der Benutzer
meist selbst wählen kann. Warum allein schon die Möglichkeit, die
Authentisierungsdaten selbst zu wählen, eine schlechte Idee sein kann,
erfahren Sie später – zunächst geht es darum, wie mit diesen Daten ver-
fahren wird.
Die allermeisten Login-Formulare werden nach dem Abschicken
gegen eine Datenbank geprüft – dabei wird dem jeweiligen Daten-
bankclient eine folgendermaßen aufgebaute Abfrage übergeben:
$query = " SELECT username
FROM auth_users
WHERE username = '" . $_POST['user'] . "'
AND password = '" . $_POST['password'] . "'";
Die meisten Entwickler vergessen jedoch, dass eine solche Abfrage je
nach Typ und Konfiguration der Datenbank oder Tabelle Groß- und
Kleinschreibung nicht beachtet: Ein Benutzer namens »absynth« mit
dem Passwort »geheim« könnte sich genauso als »ABSyntH« mit der
Kennung »gEhEiM« einloggen.
Dadurch wird Angreifern ein Brute-Force-Angriff gegen das durch
den Login-Bereich gesicherte System wesentlich erleichtert, da der
Suchraum für Passwörter deutlich verkleinert wird, nämlich auf 2,8
Billionen Möglichkeiten für ein 8-stelliges Passwort mit Buchstaben
und Ziffern. Ein gleich langes Passwort mit Groß- und Kleinbuchsta-
ben sowie Ziffern kann auf über 218 Billionen Arten gebildet werden.
Besser ist es, über die abgefragten Variablen per
md5() zunächst
Prüfsummen zu bilden und dann diese abzufragen:
$query = " SELECT username
FROM auth_users
WHERE MD5(username) = '" . md5($_POST['user']) . "'
AND MD5(password) = '" . md5($_POST['password']) . "'";
Hier kommt die MD5-Funktion gleich zweimal in verschiedenen
Subsystemen zum Einsatz: Die klein geschriebenen Funktionsaufrufe
TB!?79>?B=E<1B5CD5DC%$()F5BG5>45>

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required