Das Adventure PHP Framework beinhaltet bereits alle üblichen Formular-Elemente, es sind jedoch
sicher nicht alle Spezialfälle abgedeckt. Um die Funktionen der mitgelieferten Formular-Tags
einfach erweitern zu können, wurde im Release 1.7-BETA das Tag <form:addtaglib />
eingeführt. Mit Hilfe dieser Taglib können beliebige weitere Taglibs eingebunden werden.
Diese können dann dazu genutzt werden, die für den aktuellen Anwendungsfall gewünschte
Funktionalität nachzurüsten.
Das vorliegende Tutorial möchte an Hand von zwei Beispielen aufzeigen, wie der neue Tag genutzt
werden kann und welche Möglichkeiten sich dadurch ergeben. Im ersten Beispiel wird ein einfaches
Tag vorgestellt, mit dem das Datum im Formular als verstecktes Feld mitgeführt wird und das
Formular auf invalid setzt, wenn dieses innerhalb von einer konfigurierbaren Zeit abgeschickt wird.
Das dritte Kapitel zeigt, wie mit ein CAPTCHA-Tag implementiert werden kann.
Eine sehr einfache, jedoch verhältnismäßig wirkungsvolle Möglichkeit, einen
SPAM-Schutz für ein Formular zu erstellen, ist es, die Zeit zu messen, die ein Benutzer
benötigt, um ein Formular auszufüllen. Wird das Formular in zu kurzer Zeit ausgefüllt
- etwa durch einen Bot - so wird das Formular als invalide gekennzeichnet und nicht abgeschickt. Wird
mindestend die konfigurierte Zeit für das Ausfüllen benötigt, wird das Abschicken
akzeptiert.
Nachteil dieser Vorgehensweise ist, dass die Zeit, die als minimale Ausfüllzeit hinterlegt wird,
empirisch bestimmt werden muss. Das kann im schlechtesten Fall dazu führen, dass ein Benutzer
ein Formular nochmals abschicken muss.
Für die Umsetzung der unter 2.1. beschriebenen Idee wird im Folgenden ein neues Tag erstellt,
das das Formular als invalid kennzeichnet, wenn die Zeit zwischen Aufruf und Absenden zu kurz ist. Da
jedes Formular eine individuelle Ausfüllzeit besitzt, wird im Tag ein Attribut vorgesehen, mit
dem die Ausfüllzeit konfigurierbar gestaltet wird. Die Signatur des Tags hat damit folgende
Gestalt:
APF-Template
<form:antispam minfilltime="..." />
Vor der Verwendung des Tags muss dieser innerhalb des <html:form />-Tags per
Wie im Tutorial TagLibs erstellen
beschrieben ist, muss für jeden Tag eine TagLib-Implementierung erstellt werden. Der Name der
TagLib-Klasse ergibt sich dabei aus dem Präfix und der Klasse des Tags. Die Implementierung des
Anti-Spam-Tags lautet damit form_taglib_antispam. Die Aufgabe der Klasse ist es nun,
ein verstecktes Formularfeld hinzuzufügen, das speichert, wann das Formular ausgegeben worden
ist. Weiterhin muss die Zeit zwischen dem letzten Request und der aktuellen Zeit vergleichen und bei
Bedarf das Formular benachrichtigt werden. Der Code der Klasse stellt sich damit wie folgt dar:
PHP-Code
class form_taglib_antispam extends form_control {
function form_taglib_antispam(){
}
function onAfterAppend(){
// Attribute validieren
if(!isset($this->__Attributes['minfilltime'])){
$FormName = $this->__ParentObject->getAttribute('name');
trigger_error('[form_taglib_antispam::onAfterAppend()] There is not attribute "minfilltime"
given in the anti spam tag definition in form "'.$FormName.'"! Please provide the attribute
mentioned containing the time in seconds the user needs to fill in the form.');
}
// Formular als invalide markieren, falls die minimale Ausfuellzeit unterschritten wurde
$AntiSpamName = $this->__getAntiSpamName();
if(isset($_REQUEST[$AntiSpamName])){
// Informationen ueber die aktuelle und die Zeit des letzten Aufrufs sammeln
$CurrentTime = date('U');
$PreviousTime = $_REQUEST[$AntiSpamName];
$MinFillTime = $this->__Attributes['minfilltime'];
// Formular als invalid markieren, falls notwenig
if(($CurrentTime - $MinFillTime) < $PreviousTime){
$this->__ParentObject->set('isValid',false);
}
}
}
function transform(){
return '';
}
function __getAntiSpamName(){
return strtolower($this->__ParentObject->getAttribute('name')).'_antispam';
}
}
Die private Methode __getAntiSpamName() generiert den Namen des Feldes aus dem Namen
des Formulars und dem Zusatz _antispam. Da der Name hart verdratet ist, darf das
Anti-SPAM-Tag nur einmal pro Formular verwendet werden, da es sonst zu Überlagerungen kommt.
Wird der Button des Beispiel-Formulars innerhalb von weniger als 10 Sekunden geklickt, wird die
Eingabe nicht akzeptiert und das Formular als invalid gekennzeichnet.
Ein Manko der oben gezeigten Implementierung ist, dass ein auf Grund einer zu kurzen Ausfüllzeit
als invalid gekennzeichnetes Formular beim zweiten Absenden erneut als invalid gekennzeichnet wird,
da das Formular nach dem ersten Ausfüllen bereits gefüllt ist. Um dieses Problem zu umgehen,
sollte der Status des Formulars ("Wurde das Formular schon einmal abgesendet?") in der Session
mitgeführt werden.
Ähnlich dem im deutschsprachigen Forum unter
http://forum.adventure-php-fra...p=125#p125
vorgestellten Konzept, soll in diesem Tutorial ein Tag erstellt werden, der zur erweiterten
Validierung in ein Formular eingebunden werden kann. Der Tag soll zur generischen Verwendbarkeit
folgende Attribute unterstützen:
button: Name des Buttons auf dessen Klick eine Validierung durchgeführt
werden soll.
validate: "true", falls eine Validierung durchgeführt werden soll, "false"
oder fehlendes Attribut, wenn keine Validierung gewünscht ist.
image_class: CSS-Klasse für das Captcha-Bild
image_style: CSS-Stile für das Captcha-Bild
text_class: CSS-Klasse für das Text-Feld
text_style: CSS-Stile für das Text-Feld
Aus den genannten Anforderungen ergibt sich folgende Tag-Beschreibung:
Das folgende Formular zeigt die Einsatzmöglichkeit des Tags. Aus Sicherheitsgründen
generiert der Tag bei jedem Aufruf einen neuen Captcha-String.
Kommentare
Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
Für diesen Artikel liegen aktuell keine Kommentare vor.
Adventure PHP Framework (APF) is a product developed by the APF Developer Team. It's released under the GNU Lesser General Public License (LGPGL)
Commercial use is permitted.