jspit.de
Impressum

AntiBot - PHP form class

Software: AntiBot - PHP form class LGPL-Logo
Datei: class.antibot.php Download
Version: 2.0 Beta

Ziel

Ziel ist es ein Schutz gegen automatisierte Formularabfragen zu realisieren, der ganz auf überflüssige zusätzliche Nutzereingaben (Captcha, Rechenaufgaben...) verzichtet und damit auch für barrierearme Anwendungen nutzbar ist. Ein Bündel von Abwehrmaßnahmen sollen Spam-Mißbrauch und Angriffe wie CSRF erschweren. Diese Maßnahmen unterstützen die Abwehr von folgenden Sicherheitsrisiken
  1. der maschinellen "Bearbeitung von Formularen" durch Bots
  2. dem Zuschicken von alten "ausgefüllten" Formularen
  3. wiederholtes manuelles Absenden ein und derselben Formulare

Solche Maßnahmen für eine Erhöhung der Sicherheit sollten sich nicht auf Kontaktformulare beschränken.

Einfaches Beispiel

<?php
require '../class/class.antibot.php';    //Class einbinden; Pfad anpassen
require '../class/class.varcache.php';

//serverseitige Datenspeicherung
$cacheDateiName basename(__FILE__,'.php').'_9.dat';
$cache = new varCache($cacheDateiName);

//mail1: eindeutiger Name
//$cache: Instanz einer Klasse zur serverseitigen Speicherung
$aspam = new AntiBot('mail1',$cache);

if(
$aspam -> isBot()) {
  echo 
'Bot has been detected'

}

//Formular
$out '<form name="f1" action="" method="post">';
$out .= 'Name: <input name="name" type="text" value="" />';
$out .= 'Passwort: <input name="password" type="password" value="" />';
//Schutz vor Bot's
$out .= $aspam -> getProtectorInput();
//
$out .= '<input name="submit" type="submit" value="Login" />';
$out .= '</form><br>';

echo 
$out;
?>

Funktion

Es wird HTML mit einem input-Tag und Javascript erzeugt, welches zusammen in ein Formular platziert wird. Beim Abruf des Formulars wird eine Reihe von Informationen erzeugt und serverseitig gespeichert. Beim Empfang eines ausgefüllten Formulars werden diese Informationen auf Manipulation überprüft.

Benutzung

Die Nutzung der PHP AntiBot Class gestaltet sich sehr einfach. Neben der Antibot-Klasse wird noch eine zweite Klasse benötigt, welche die serverseitige Speicherung der Daten organisiert. Die Klasse varCache, die im Download mitgeliefert wird, nutzt Dateien für die Speicherung. Bei Nutzung dieser Klasse wird empfohlen, für jedes Formular eine eigene Instanz mit einer eigenen Datei zu verwenden. Pfad und Dateiname sollten den eigenen Bedürfnissen angepasst werden. Soll für die Datenspeicherung z.B. eine Datenbank benutzt werden, kann der Nutzer dafür eine eigene Klasse erstellen. Der Konstruktor der AntiBotklasse(V2) benötigt 2 Parameter:
- Ein eindeutiger Name, der gleichzeitig als Name des input-Feldes dient
- Die Instanz einer Klasse, welche das Interface cacheInterfaceAll implementiert hat.
Jedes zu schützende Formular benötigt eine eigene Instanz der Antibot-Klasse mit einen einmaligen Namen als ersten Parameter.

Methoden

NameBedeutung
getProtectorInput() Liefert den kompletten HTML und Javascript-Code als String zum Einfügen in das zu schützende Formular.
setTimeSlot() Setzt das Zeitfenster für eine Akzeptanz der Nutzereingaben neu. Als Parameter werden eine untere und eine obere Zeitgrenze erwartet, die als String mit einem relativen Format wie es die DateTime-Klasse akzeptiert zu liefern sind. Als Defaultwerte sind setTimeSlot("5 seconds","20 Minutes") gesetzt. Es wird false zurückgegeben, wenn keine gültigen relativen Zeitformate erkannt wurden.
isBot() Der Rückgabewert von isBot() ist true, wenn ein Bot identifiziert wurde. Deaktiviertes Javascript führt ebenfalls zu einer Boterkennung. In der Entwicklungsphase kann die Information zur Ursache der Boterkennung hilfreich sein. Diese Information liefert die Methode getIdentDescription(). Wurde noch kein Formular gesendet, liefert isBot() immer false.
isFormSend() Die function isFormSend() liefert eine Information true/false ob das input-Feld mit dem beim Erstellen der Instanz gewählten Namen im Formular enthalten ist oder nicht. Das Ergebnis ist somit false bei Anforderung eines Formulars, true bei gesendeten Formularen. Die Nutzung von isFormSend ist optional, der Nutzer kann auch wie gewohnt seine POSTs für die Auswertung heranziehen.
getIdentDescription() Die function getIdentDescription() liefert eine Information welche Maßnahme primär zur Identifizierung des Bot's geführt hat. Diese Information sollte nur zum Debugging genutzt werden und nicht den Angreifer Hinweise liefern.

Eine Überprüfung der Formularfelder auf sinnvolle Inhalte bietet einen zusätzlichen Schutz und sollte auch bei Nutzug dieser Klasse nicht unterbleiben.