Zum Inhalt springen
Der Guide für ein smartes Leben.
Gefälschte Zugriffe im Netz [Hintergrund]

Teil 3: Erklärt: So nutzen Hacker Cross Site Request Forgery für Angriffe

Autoren: Redaktion pcmagazin und Anna Kobylinska • 2.2.2010 • ca. 2:15 Min

Das Grundgerüst des benötigten Formulars, hier am Beispiel von Börsentransaktionen, könnte zum Beispiel so aussehen:...

Das Grundgerüst des benötigten Formulars, hier am Beispiel von Börsentransaktionen, könnte zum Beispiel so aussehen:

<form action="Aktien_kaufen.php" method="post"><dl><dt><label for="aktiensymbol">
Aktiensymbol:</label></dt><dd><input type="text"
name="aktiensymbol" id="aktiensymbol" /></dd><dt><label for="anzahl">Anzahl:</label></dt><dd><input type="text" name="anzahl"
id="anzahl" /></dd><dd><input type="submit"
value="Kaufen" /></dd></dl></form>

Dieses Formular wird nur einem zuvor authentifizierten Benutzer angezeigt. Dennoch könnte ein Angreifer mittels XSRF einen Aktienkauf auslösen, sollte es ihm gelingen, einen bereits eingeloggten Benutzer zum Abschicken von Formulardaten an das Skript Aktien_kaufen.php zu bringen. Um einen XSRF-Angriff zu verhindern, wird in dieses Formular ein einmaliger Token (ein Formularschlüssel) eingebaut.

Schritt 2. Zum Erzeugen und Speichern eines eindeutigen Formularschlüssels kommt eine PHP-Klasse zum Einsatz. Hierzu erstellen Sie eine Datei namens formkey.class.php und platzieren Sie diese im Dokumentenverzeichnis des Webservers.

Da jede einzelne Webseite nur einen einzigen Formularschlüssel enthalten darf, könnten Sie auch einen Singleton der PHP-Klasse einsetzen. Der Code zum Erstellen des Formularschlüssels in der PHP-Datei formkey.class.php könnte so aussehen:

class formKey {
private $formKey;
private $alter_formKey;
private function erzeugeKey() {
$ip = $_SERVER['REMOTE_ADDR'];
$uniqid = uniqid(mt_rand(), true);
return md5($ip . $uniqid);
}

Der neu erzeugte Formularschlüssel wird in der Variable $formKey erfasst und der alte Formularschlüssel - falls existent - in $alter_formKey abgespeichert. Mehr dazu im Schritt 5. Das Erstellen eines einmaligen, nicht zu erratenden Formularschlüssels übernimmt die Funktion erzeugeKey().

Hierzu wird im ersten Schritt die IP-Adresse des Anwenders ermittelt, von dem die Anfrage herausgeht, und diese dann mit einer einmaligen Identifikationszahl zu einem MD5-Hash verarbeitet. Dadurch wird verhindert, dass sich das Resultat erraten lässt.Für das Errechnen der Zufallszahl zeichnet statt rand() die Funktion mt_rand() verantwortlich, weil sie bessere Zufallszahlen liefert. Die Option true sogt für eine höhere Länge der Zeichenkette.

Sicherheit: Cross Site Request Forgery
Mittels OWASP CSRF Tester können Sie Ihre Webseiten hinsichtlich CSRF-Risiken überprüfen.
© Archiv

Schritt 3. Der so erzeugte Schlüssel muss in das Formular eingefügt werden. Die benötigte Funktion outputKey() vollzieht dies in drei Teilschritten: Sie initiiert die Erzeugung des Formularschlüssels, speichert ihn für die Dauer der Sitzung ab und gibt ihn aus. Erzeugen und Speichern des Schlüssels innerhalb der Klasse erfolgt mittels:

$this->formKey = $this->erzeugeKey();

Speichern des Formularschlüssels in einer Sitzung:

$_SESSION['form_key'] =
$this->formKey;

Ausgabe des Formularschlüssels:

echo "<input type='hidden'
name='form_key' id='form_key' value='".$this->formKey."' />";

Die Funktion outputKey() nimmt also die folgende Form ein:

public function outputKey() {
$this->formKey = $this->erzeugeKey();
$_SESSION['form_key'] =
$this->formKey;
echo "<input type='hidden'
name='form_key' id='form_key' value='".$this->formKey."' />";
}