Das Örtchen RSS-Feed
Kategorie
Kategorie: Blog
Buttons & Statistiken
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.

Hallo! Bist du neu hier? Dann abonniere doch den RSS-Feed dieses nicht mehr ganz so stillen Örtchens, um über meine geistigen Ergüsse auf dem Laufenden zu bleiben. Alternativ besteht auch die Möglichkeit, sich von FeedBurner per E-Mail über meine Ausscheidungen benachrichtigen zu lassen.

Neuen Kommentar schreiben

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

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.