Das Örtchen RSS-Feed
Kategorie
Kategorie: Blog
Buttons & Statistiken

Drupal Association - Individual Member

Neueste Kommentare

Drupal: URL-Spam bei Webform(s) verhindern

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:

  1. Validation API (abandoned, Support/Weiterentwicklung fraglich)
  2. Covert Fields (nur CCK)
  3. Rules (mit Kanonen auf Spatzen schießen)
  4. Easy Field Validation (nicht im offiziellen Repository)
  5. 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.

Bild von Jan Teriete Hallo! Bist du neu hier? Dann abonniere doch den RSS-Feed dieses mal mehr oder weniger stillen Örtchens, um über meine geistigen Ergüsse auf dem Laufenden zu bleiben. Du kannst aber auch gerne diesen Artikel in den sozialen Netzwerken teilen und mit Deinen Kontakten über das Thema diskutieren.

Neuen Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
Der Inhalt dieses Feldes wird öffentlich zugänglich angezeigt, aber als rel="nofollow" markiert.
Hinweis

Die mit einem Stern markierten Daten werden zur Bearbeitung Deines Kommentars benötigt und zusammen mit Deiner IP-Adresse erfasst (siehe Datenschutzerklärung).

Kommentare beleben den Blog! Ich freue mich über jeden Kommentar. Du kannst hier offen Deine Meinung zum Artikel sagen, aber bitte beachte die Netiquette und vermeide es andere zu beleidigen.

Bitte unterlasst es die Kommentare zu SEO-Zwecken zu missbrauchen. Kommentare mit Links, die nicht zu Blogs führen (oder zu Blogs mit Grauzonen-Themen) und/oder Keywords als Namen verwenden, sind nicht erwünscht!

Möchtest Du mir einen Blog-Artikel schmackhaft machen, dann schreib die URL ohne HTML-Tag in den Kommentarbereich und ich werde diesen bei Gefallen verlinken.