PHP-Klasse formsign
Die elegante Lösung, die das HTML-Formular vor maschineller Manipulation schützt. Eine barrierefreie, unsichtbare Alternative zum CAPTCHA.
Lizenz: GNU Lesser General Public License, Version 3
Autor: Adam Steuer, as(at)nd-info.de
Die Downloads enthalten fünf Dateien: formsign.class.php, example.php, exdb.php, exfile.php, COPYING.LESSER.
PHP-Klasse formsign, Version 0.8 für php 5 (06.06.2009, zip 14 kb): Download (442)
PHP-Klasse formsign, Version 0.8 für php 4 (06.06.2009, zip 14 kb): Download (360)
Hier finden Sie ein Anwendungsbeispiel: Beispielformular
Die PHP-Klasse formsign ist eine Antwort auf die Frage, wie eine Website, die Formulare beinhaltet, barrierefrei und dennoch vor Spambots gut geschützt sein kann.
Bekannte Problembeispiele sind Websites mit Formularen für Registrierung, Mail, Online-Umfragen, Kommentaren in Blogs, Beiträgen in Foren, Wiki und Gästebücher. Häufig werden zur Problemlösung CAPTCHAs ("Completely Automated Public Turing test to tell Computers and Humans Apart") verwendet. Die bekannten Kritikpunkte sind u.a. technologische Eskalation, problematische Barrierefreiheit, Lästigkeit. Mehr dazu auch in Wikipedia http://de.wikipedia.org/wiki/Captcha.
Bei der Entwicklung der Klasse formsign standen Barrierefreiheit und Benutzerfreundlichkeit an erster Stelle. Die Prüfung, ob ein Formular von einem Menschen oder einer Maschine verschickt wurde, läuft automatisch und unsichtbar im Hintergrund ab. Der Besucher der Internetseite verschickt Formulare, ohne zusätzliche Aufgaben lösen zu müssen (wie etwa beim Einsatz vom CAPTCHA). Der Schutz des Formulars wird durch Erstellung eines Siegels und eine Verhaltensanalyse des Besuchers realisiert. Das Beispielformular zeigt formsign im Einsatz.
1. Arbeitsweise
Im Wesentlichen besteht die Klasse aus zwei Funktionen: Die Funktion „create_sign“ erstellt das Siegel für das Formular, „check_sign“ prüft das Formular auf Gültigkeit des Siegels.
1.1 Funktion create_sign: Erstellung des Sicherheitssiegels
Die Funktion create_sign erstellt zwei versteckte Input-Felder. Der Name des ersten Feldes besteht aus einer Zeichenkette (salt), dem aktuellen UNIX-Zeitstempel und der IP-Adresse des Besuchers. Um den Namen dieses Feldes zu maskieren, wird daraus ein md5 Hash erstellt. Der Wert dieses Feldes ist identisch mit dem Feld-Namen. Die Einbeziehung der aktuellen Uhrzeit bewirkt, dass bei jedem Neuladen der Seite ein anderer Name (Siegel) erstellt wird. Die IP-Adresse funktioniert als Fingerabdruck des Besuchers. Das zweite versteckte Feld enthält als Wert den Zeitstempel der Formulargenerierung.
1.2 Funktion check_sign: Prüfung der Gültigkeit des Siegels und der Zeitspanne zwischen Aufrufen und Versenden des Formulars
Bei der Auswertung kommt die Funktion check_sign zum Einsatz. Zunächst wird geprüft, ob ein gültiges Siegel für ein Formular vorliegt. Ist das nicht der Fall, wird das Formular als ungültig eingestuft und weitere Prüfungen eingestellt. Ist das Siegel gültig, folgt die Prüfung der Zeitspanne zwischen Aufrufen und Versenden des Formulars. Es wird davon ausgegangen, dass der Mensch zum Ausfüllen eines Formulars mehr Zeit benötigt als eine Maschine. Das drückt sich je nach Formularumfang in der Einstellung min_limit aus. Ist die abgelaufene Zeit kürzer als in der Variablen min_limit voreingestellt, lässt das vermuten, dass eine Maschine das Formular ausgefüllt hat.
Auch die maximale Zeit zum Ausfüllen des Formulars ist zu begrenzen. Sie kann je nach Art und Umfang des Formulars zwischen einigen Minuten und einigen Stunden varrieren. Für diese Einstellung ist die Variable max_limit vorgesehen. Ist die abgelaufene Zeit länger als voreingestellt, lässt sich ebenfalls eine Manipulation des Formulars durch eine Maschine nicht ausschließen. In diesem Fall wird das Formular einer zusätzlichen Prüfung unterzogen, z.B. über eine Vorschau des Formulars mit der Aufforderung zur Bestätigung.
Entscheidend für die Qualität der Sicherung ist eine gute Anpassung der beiden Variablen min_limit und max_limit.
Hinweis
Die Anwendung der PHP-Klasse formsign ist eine Sicherheitsmaßnahme, mit der sich die meisten Spambots erkennen und abweisen lassen. Einen 100-prozentigen Schutz bietet sie aber nicht. Zur Abwehr eines gezielten Angriffs können weitere Maßnahmen eingesetzt werden wie z.B. eine Erweiterung des Siegels um eine Session-ID.
2. Einbindung und Anwendung
2.1 Einbindung
Die Klasse wird mit folgender Code-Zeile in das PHP-Skript eingebunden:
include("formsign.class.php");
Das Objekt der Klasse wird durch Aufrufen des Konstruktors erstellt:
$FSO = new formsign ($salt, $min_limit, $max_limit);
Dafür ist die Variable $salt einzustellen. Dabei handelt es sich um eine Zeichenkette, die aus Klein-/Großbuchstaben, Ziffern und Satzzeichen besteht und mindestens 11 Zeichen umfassen soll. Beispiel:
$salt="Xa< :% 24Gd& Yfm( +D=::U";
Der Wert des zweiten Parameters $min_limit entspricht der minimalen Zeit zwischen Aufrufen und Versenden des Formulars. Die Zeit wird in Sekunden angegeben.
Der Wert des dritten Parameters $max_limit entspricht der maximalen Zeit zwischen Aufrufen und Versenden des Formulars. Die Zeit wird in Sekunden angegeben.
$min_limit=10;
$max_limit=1800; // 30 Minuten
Um diese Klasse effektiv zu nutzen, wird empfohlen, mit einer Datenbank bzw. mit einer Textdatei zu arbeiten. Dort werden die gültigen Siegel notiert und nach Ablauf der Gültigkeit gelöscht.
Die Nutzung der Datenbank erfolgt mit der Code-Zeile:
$FSO->use_database($DB);
Dabei ist die Variable "DB" eine gültige Resource der Datenbankverbindung. Die Beschreibung der entsprechenden Datenbanktabelle ist im Downloadpaket in der Datei example.php enthalten.
Alternativ kann eine Textdatei benutzt werden:
$FSO->use_file($filename);
Dabei ist $filename der Name dieser Textdatei. Sie soll für das PHP-Skript beschreibbar sein:
$filename="daten.txt";
2.2 Anwendung
Erstellung des Siegels – Die Funktion create_sign wird mit keinem oder einem Parameter aufgerufen und liefert den HTML-Code des Siegels zurück; Ohne Parameter wird der XHTML konforme Code geliefert. Der HTML-Code wird durch Parameter "0" erzwungen.
$sign=$FSO->create_sign(); // Liefert XHTML Tags
oder
$sign=$FSO->create_sign("0"); // Liefert HTML Tags
Die Variable $sign enthält die Input-Felder des Siegels und soll in das Formular eingebunden werden:
...
<form action="index.php" method="POST"><?phpecho $sign; ?><input type="text" name="email" />
...
</form>
...
Prüfung – Die Prüfung wird mit der Funktion check_sign durchgeführt:
$FSO->check_sign($_POST);
Diese Funktion antwortet mit TRUE, wenn ein gültiges Siegel existiert und die Werte min_limit und max_limit nicht unter- bzw. überschritten sind. Andernfalls wird mit FALSE geantwortet.
Die Funktion get_gs_diff() liefert die Zeitdifferenz zwischen dem Aufrufen und dem Versenden des Formulars und kann für eine genauere Analyse des Verhaltens des Besuchers eingesetzt werden:
$difference=$FSO->get_gs_diff();
