Spam via je contactformulier? Zo houd je het tegen zonder reCAPTCHA
Je formulier werkt. Een beetje te goed. Elke ochtend staan er tien nieuwe aanvragen klaar: een SEO-aanbod in het Engels, iets met crypto, en een Henry die al drie keer dezelfde tekst stuurde. Ergens daartussen zit een echte klant. Die mis je, omdat je allang gestopt bent met lezen.
De reflex is reCAPTCHA. Dat werkt matig en het kost je iets. Versie 2 laat je bezoekers stoplichten aanklikken, en elke extra drempel kost je echte aanvragen. Versie 3 is onzichtbaar, maar laadt scripts van Google op je pagina’s en stuurt gegevens van je bezoekers naar Google. Dat hoort achter je cookiebanner. Weigert iemand de cookies, dan moet je kiezen: het formulier blokkeren of onbeschermd laten.
Het kan beter met een paar lagen die elk een ander soort bot tegenhouden. Samen vangen ze bijna alles, en een echte bezoeker merkt er niets van. Ik laat het zien in Gravity Forms, maar het idee werkt in elke formulierplugin.
Laag 1: de honeypot
Gravity Forms heeft er een ingebouwd, maar op oudere formulieren staat hij vaak uit. Open je formulier, ga naar Instellingen, Formulierinstellingen en scroll naar het blok Spamdetectie. Zet Detect spam using the Advanced Honeypot aan.
Een honeypot is een onzichtbaar veld. Een mens ziet het niet en laat het leeg. Een bot vult braaf alles in wat hij tegenkomt en valt daarmee door de mand. De Advanced Honeypot controleert daarnaast een code die pas via JavaScript in je formulier komt. Bots die je formulier rechtstreeks bestoken zonder de pagina echt te laden, missen die code.
Daaronder staat de vraag wat er met zo’n inzending moet gebeuren. Kies Create an entry and mark it as spam. Een spaminzending stuurt geen notificatie, dus je inbox blijft schoon. Hij staat wel in de map Spam bij je inzendingen. Valt er ooit een echte klant tussen, dan vind je die daar terug.
Laag 2: te snel is verdacht
In hetzelfde blok staat Submission Speed Check. Die staat standaard uit. Zet je hem aan, dan wordt elke inzending die sneller verstuurd is dan de drempel als spam gemarkeerd. Standaard is die drempel 2000 milliseconden.
Een mens heeft voor naam, e-mailadres en een bericht al gauw een halve minuut nodig. Een bot doet het in een fractie van een seconde. Voor een contactformulier kun je de drempel dus prima op 3000 zetten.
Bij een nieuwsbriefformulier met alleen een e-mailveld ligt dat anders. Met automatisch aanvullen van de browser is een mens daar in twee seconden klaar. Houd de drempel daar laag, anders belanden je echte inschrijvingen in spam.
Laag 3: geen links waar geen links horen
De meeste spam wil maar één ding: een link bij jou achterlaten. Echte klanten zetten zelden een link in hun bedrijfsnaam.
Open een veld in de formuliereditor en zet No Links/URLs aan. Dat kan bij tekstvelden, alinea-tekst, lijsten en verborgen velden. Het naamveld met voor- en achternaam heeft de optie niet.
Wat er gebeurt als iemand toch een link invult, stel je in bij Spamdetectie, onder If Links/URLs are found in supported fields. Ik kies meestal Mark the field as invalid during validation. Een mens krijgt dan een melding en haalt de link weg. Een bot snapt die melding niet.
Wil je dat klanten hun huidige website kunnen noemen, zet de optie dan niet op het berichtveld. Geef ze een apart veld voor hun website.
Laag 4: Turnstile als het blijft lekken
Komt er na die drie lagen nog steeds rommel door, dan heb je meestal te maken met bots die de pagina wel laden en rustig de tijd nemen. Dan zet je Cloudflare Turnstile erbij. Dat is het antwoord van Cloudflare op reCAPTCHA. Het controleert vooral op de achtergrond, en een bezoeker ziet hooguit een vinkje. Geen stoplichten.
Gravity Forms heeft er een officiële add-on voor, en die zit in elke licentie. Je site hoeft niet via Cloudflare te lopen. Een gratis account is genoeg.
- Log in bij Cloudflare, ga naar Turnstile en kies Add widget. Geef hem een naam en vul je domein in.
- Kopieer de sitekey en de secret key.
- Installeer in WordPress de Cloudflare Turnstile Add-On via Formulieren, Add-ons.
- Plak de sleutels onder Formulieren, Instellingen, Cloudflare Turnstile.
- Sleep het Turnstile-veld in je formulier. Je vindt het bij de geavanceerde velden. Heeft je formulier meerdere pagina’s, zet het dan op de laatste.
Het blijft een extern script. Zet het dus wel in je privacyverklaring.
En Akismet?
Gravity Forms kan ook met Akismet praten, via een add-on die ook in elke licentie zit. Akismet vergelijkt elke inzending met wat het op miljoenen andere sites heeft gezien. Dat werkt goed, maar de gratis versie is alleen voor persoonlijke sites. Voor een zakelijke site betaal je op dit moment € 9,95 per maand. Voor een gewoon contactformulier zijn de lagen hierboven meestal genoeg.
Je eigen regel toevoegen
Soms zie je een patroon dat geen enkele laag pakt. Een bekend voorbeeld: berichten in het Cyrillisch, elke dag weer. Met de filter gform_entry_is_spam maak je daar zelf een regel voor:
add_filter( 'gform_entry_is_spam', function ( $is_spam, $form, $entry ) {
if ( $is_spam ) {
return $is_spam;
}
foreach ( $entry as $sleutel => $waarde ) {
if ( is_numeric( $sleutel ) && is_string( $waarde ) && preg_match( '/\p{Cyrillic}/u', $waarde ) ) {
return true;
}
}
return $is_spam;
}, 10, 3 );
De is_numeric-check zorgt dat je alleen kijkt naar wat er in de velden is ingevuld, en niet naar de gegevens die Gravity Forms er zelf bij zet. Zet de code in een eigen plugin of in functions.php van je child theme. Heb je klanten in Oost-Europa, dan is dit uiteraard geen goed idee. Pas het patroon aan op wat jij binnenkrijgt.
Waar het meestal misgaat
- De honeypot staat op Do not create an entry. Valt er een echte klant door de mand, dan is die spoorloos. Kijk de eerste weken af en toe in je spammap.
- Alleen het contactformulier beveiligd. Elk formulier heeft zijn eigen instellingen. Het nieuwsbriefformulier in je footer wordt vaak vergeten, en dat staat op elke pagina.
- De spam komt helemaal niet via je formulier. Staat hij niet bij je inzendingen, dan komt hij ergens anders vandaan. Meestal een e-mailadres dat leesbaar op je site staat, of een oud formulier van een andere plugin op een vergeten pagina.
- Een pagina die maandenlang in de cache staat. De controlecode van de honeypot hoort bij de versie van Gravity Forms. Na een update accepteert hij de vorige versie nog, maar een pagina die twee updates achterloopt stuurt een code mee die niet meer klopt. Dan belandt ineens alles in spam. Leeg je cache na een update van Gravity Forms.
- Aanvragen komen niet aan, maar staan ook niet in spam. Staat de inzending gewoon bij je inzendingen, dan doet je spamfilter het goed en gaat het mis bij de mail. Dat is een ander verhaal.
Tot slot
Begin met de honeypot en de snelheidscheck. Dat kost twee minuten, en daarmee ben je bij de meeste sites het grootste deel al kwijt. Komt er daarna nog rommel door, dan pas Turnstile. En kijk de eerste weken af en toe in je spammap. Liever een keer te veel gekeken dan een klant die denkt dat je nooit terugbelt.