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

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

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

Schritt 4. Das Formular aus dem ersten Schritt kann jetzt mit dem FormularschlüsSicherheitstools sel gesichert werden. Hierzu fügen Sie der PHP-Datei oberhalb der doctype- und head-Tags den folgenden Quelltext hinzu:...

Schritt 4. Das Formular aus dem ersten Schritt kann jetzt mit dem FormularschlüsSicherheitstools sel gesichert werden. Hierzu fügen Sie der PHP-Datei oberhalb der doctype- und head-Tags den folgenden Quelltext hinzu:

session_start();
require('formkey.class.php');
$formKey = new formKey();

Mittels session_start() wird die Sitzung initialisiert, damit der zu erzeugende Schlüssel abgespeichert werden kann. Hierzu wird die eben erstellte Klasse aus formkey.class.php mittels require eingebunden. Danach wird die Klasse mit dem Aufruf des neuen Formularschlüssels initialisiert und in $formKey erfasst. Nun gilt es lediglich, das Formular mit dem Formularschlüssel zu versehen:

<?php $formKey->outputKey(); ?>
in das Formular eingefügt:<form action="Aktien_kaufen.php" method="post"><dl><?php $formKey->outputKey(); ?><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>

Schritt 5. Da die Funktion erzeugeKey() die Sitzungsvariable überschreibt, müssen wir einen Konstruktor zu unserer PHP-Klasse hinzufügen, der beim Aufruf der PHP-Klasse zum Einsatz kommt. Der Konstruktur wird den vorigen Schlüssel - falls vorhanden - in einer Klassenvariable abspeichern, bevor ihn der neue Formularschlüssel überschreiben kann. Auf diese Weise steht der zuletzt gültige Formularschlüssel für eine Validierung zur Verfügung. Die PHP-Klasse wird um die folgende Funktion ergänzt:

function __construct() {
if(isset($_SESSION['form_key'])) {
$this->alt_formKey = $_SESSION['
form_key']; }
}

Der Name des Konstruktors beginnt mit einem Unterstrich, damit der Quelltext leichter zu lesen ist. Beim Aufruf des Konstruktors erfolgt erst einmal eine Prüfung, ob die Sitzung überhaupt eingerichtet wurde und falls ja, wird der alte Schlüssel der Sitzung lokal in der Variable alt_formKey erfasst. Um den Formularschlüssel validieren zu können, erzeugen Sie jetzt eine Funktion innerhalb der Klasse.Da Sie auf diese Funktion auch von außerhalb der Klasse zugreifen werden, sollten Sie diese als public deklarieren. Der Zweck der Funktion besteht in der Validierung des POST-Wertes des Formularschlüssels, indem dieser mit dem gespeicherten Wert des Formularschlüssels aus der alten Sitzungsvariable verglichen wird. Die benötigte Funktion wird nun wie folgt der PHP-Klasse hinzugefügt:

Sicherheit: Cross Site Request Forgery
Ohne die passenden Sicherheitsvorkehrungen wie dynamisch erzeugte Tokens kann ein harmlos aussehendes Formular Angreifern praktisch uneingeschränkten Zugriff auf interne Funktionen der Web-Applikation gewähren, die authentifizierten Benutzern vorbehalten sein sollten.
© Archiv
public function validieren() {
if($_POST['form_key'] ==
$this->alt_formKey) { return true; }
else { return false; }
}

Ist der Schlüssel gültig, liefert die Funktion den Rückgabewert true, andernfalls false.

Die Validierung des Formularschlüssels erfolgt durch den Aufruf der gerade erstellten Funktion validieren(). Zu beachten ist hierbei lediglich, dass Sie die Validierung erst nach der POST-Anfrage durchführen dürfen. Hierzu fügen Sie hinter die folgende Zeile

$formKey=new formKey();

diesen Quelltext ein:

$error = 'Kein Fehler';
if($_SERVER['REQUEST_
METHOD'] == 'post') {
if(!isset($_POST['form_key']) ||
!$formKey->validieren()) {
$statusmeldung = 'Fehler'; }
else { $statusmeldung = 'kein Fehler
aufgetreten.'; }
}