Ich habe ja schon öfters über meinen Kampf gegen den Spam geschrieben (zuletzt beim Kommentarbereich dieses Blogs). Mein Vorschlag war damals das Modul Block anonymous links um bei Gästen jegliche Einträge mit Links zu unterbinden. Heute stand ich nun vor dem Problem, daß eine Kundin über die (mit Webform umgesetzten) Kontaktformulare trotz CAPTCHAs mehr oder weniger massiven URL-Spam bekam.
Die Recherche
Also begab ich mich auf die Suche nach Validierungsmodulen für Drupal 6. Folgende Ergebnisse fand ich mittels Big G:
- Validation API (abandoned, Support/Weiterentwicklung fraglich)
- Covert Fields (nur CCK)
- Rules (mit Kanonen auf Spatzen schießen)
- Easy Field Validation (nicht im offiziellen Repository)
- Webform Validation (leider nur für Webform)
Eigentlich hätte ich gerne Modul 1 benutzt, da es scheinbar für jegliche Formulare (Forms-API) funktioniert und somit die umfassendste Lösung wäre. Da der bisherige Maintainer das Modul jedoch nicht mehr weiterentwickelt und sich bisher kein offizieller Nachfolger gefunden hat, habe ich mich lieber für Modul 5 entschieden.
Die Lösung
Nach der grundsätzlichen Modul-Entscheidung ging es an die Umsetzung der Kunden-Anforderungen. Hierbei sollte fortan nur noch eine URL-Angabe im Nachrichten-Bereich (textarea) des Kontaktformulars erlaubt sein. Ich bin mir nicht sicher, ob dies auch direkt im Modul mit einem regulären Ausdruck lösbar ist, ich war jedenfalls zu doof dazu und habe eine neue Validierungs-Regel als eigenes Modul eingebunden. Dies war den beiden verfügbaren Beispielen validate_id und valid_url folgend auch nicht wirklich schwer:
<?php /** * Implementation of hook_webform_validation_validators(). */ function url_spam_in_webform_validation_validators() { return array( 'url_spam_in' => array( 'name' => "URL Spam-IN", 'component_types' => array( 'textarea' ), 'description' => t( "Validates that the user-entered data doesn't contain more than one url." ) ) ); } /** * Implementation of hook_webform_validation_validate(). */ function url_spam_in_webform_validation_validate($validator, $items, $components, $rule) { if (!empty($items) && is_array($items)) { switch ($validator) { case 'url_spam_in': foreach ($items as $key => $val) { if ( !empty($val) && preg_match_all('|https?\://\S+|', $val, $matches, PREG_SET_ORDER) && (count($matches) > 1) // one url is allowed ) { $errors[$key] = t( '%item contains more than one url.', array('%item' => $components[$key]['name']) ); } } return $errors; break; } } } ?>
Fazit
Das Modul Webform Validation finde ich bislang extrem vielversprechend, da es etliche Validierungen jenseits der Pflichtfeld-Prüfung integriert hat und beispielsweise die Nutzung von Spamicide auf normalen Websites (ohne Blog bzw. Kommentarbereich) überflüssig macht. Auch die direkte Nutzung von einfachen regulären Ausdrücken über das Backend bietet einigen Spielraum für spezielle Anforderungen.
Lediglich einen Umstand finde ich persönlich etwas nervig, nämlich die Aktivierung jeder Prüfung für jedes einzelne Formular und dort für jedes betroffene Feld. Man muss also alle Formulare einzeln bearbeiten und für jede Prüfung festlegen für welche Felder sie gelten soll. Hier wäre es beispielsweise klasse gewesen, wenn eine spezielle Validierung in einem Rutsch für alle Textareas aktivierbar wäre.



Kommentar hinzufügen