WordPress-contactformulieren: een beveiligingschecklist
Contact Form 7, WPForms, Gravity Forms, Ninja Forms of Fluent Forms – de plug-in doet er minder toe dan hoe hij is ingesteld en onderhouden. Dit is wat u moet controleren, en wat u na elke update opnieuw moet controleren.
De meeste WordPress-sites gebruiken een van een handvol formulierplug-ins: Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Fluent Forms en nog een paar. Elk daarvan kan veilig worden gebruikt of wagenwijd open blijven staan. Het verschil zit zelden in de plug-in zelf, maar in de instellingen, de add-ons eromheen, de manier waarop mail de server verlaat en wat er met berichten gebeurt zodra ze binnenkomen.
- Houd de formulierplug-in en elke add-on up-to-date, en verwijder de plug-ins die u niet meer gebruikt.
- Schakel de eigen antispam van de plug-in in – honeypot, CAPTCHA-integratie, Akismet waar dat past – en controleer of die echt werkt.
- Verstuur meldingen via geauthenticeerde SMTP vanaf een adres op uw eigen domein.
- Beperk uploads naar type en grootte, en voorkom dat geüploade bestanden openbaar worden weergegeven of doorzocht.
- Houd het e-mailadres van de ontvanger uit de pagina en de broncode.
- Sla alleen de inzendingen op die u nodig hebt, en alleen zo lang als u ze nodig hebt.
- Voer na elke update van WordPress, het thema of een plug-in een korte controle uit.
Updates: de formulierplug-in en alles eromheen
Formulierplug-ins zijn populaire doelwitten, omdat ze invoer accepteren van iedereen op internet. Beveiligingsfixes komen als gewone updates, dus werk snel bij – en niet alleen de hoofdplug-in. Add-ons voor betalingen, uploads, CRM-koppelingen, voorwaardelijke logica of extra CAPTCHA-aanbieders zijn afzonderlijke code met eigen kwetsbaarheden. Hetzelfde geldt voor plug-ins die u ooit voor een test hebt geïnstalleerd en bent vergeten. Deactiveren is niet genoeg: gedeactiveerde plug-ins staan nog op de server, en hun bestanden zijn in sommige gevallen rechtstreeks bereikbaar. Gebruikt u hem niet, verwijder hem dan.
Antispam: inschakelen, en dan bewijzen dat het werkt
De meeste formulierplug-ins hebben eigen antispamopties of werken samen met externe diensten: een honeypotveld dat bots invullen en mensen nooit zien, CAPTCHA’s zoals reCAPTCHA, hCaptcha of Cloudflare Turnstile, en Akismet, dat de inhoud van berichten vergelijkt met een spamdatabase. De opties verschillen per plug-in en versie, dus controleer de instellingen in plaats van ervan uit te gaan. Externe CAPTCHA’s laden scripts van een derde, en Akismet stuurt de ingezonden inhoud naar een externe dienst – beide horen in uw privacyverklaring en, afhankelijk van uw configuratie, in uw toestemmingsbeheer.
Het vaker voorkomende probleem is bescherming die is ingeschakeld maar niet werkt. Een CAPTCHA die op openbare testsleutels draait, laat alles door. Een widget waarvan het script wordt geblokkeerd door een caching- of optimalisatieplug-in, of door een JavaScript-fout, houdt niets tegen. Een honeypotveld zonder de stijlen die het verbergen, wordt door schermlezers voorgelezen en door echte bezoekers ingevuld. Open het formulier dus na elke wijziging in een privévenster, controleer de browserconsole en de broncode van de pagina, en stuur een testbericht. Wilt u bescherming die niet van Google afhangt, dan voegt de gratis WordPress-plug-in van formexposed een honeypot, een tijdcontrole en proof-of-work toe en controleert hij de site opnieuw na plug-inupdates – één optie van meerdere.
Mail: hoe hij wordt verzonden en waar hij naartoe gaat
Standaard geeft WordPress mail door aan de PHP-mailfunctie van de server, en bij veel hosts zijn die berichten slecht geauthenticeerd en belanden ze in de spam – of verdwijnen ze stilletjes. Verstuur in plaats daarvan via een SMTP-plug-in of de maildienst van uw host, met een echte mailbox met gebruikersnaam en wachtwoord en een afzenderadres op uw eigen domein, zoals een speciaal formulieren@-adres. De SPF-, DKIM- en DMARC-records van het domein moeten deze afzender dekken. Zet het adres van de bezoeker niet in het From-veld: het is niet uw domein, dus het bericht kan niet slagen voor de DMARC-alignment en belandt, afhankelijk van het beleid van het domein van de bezoeker, in de spam of wordt geweigerd. Zet het als Reply-To, dan kunt u nog steeds met één klik antwoorden.
Het ontvangstadres hoort in de instellingen van de plug-in, niet in de pagina. Controleer de broncode van uw contactpagina: een mailto-link naast het formulier, of een verborgen veld met het ontvangstadres, geeft dat adres aan elke adresverzamelende bot. Bij oudere of op maat gebouwde formulieren kan het erger zijn – als de server een verborgen ontvangersveld vertrouwt, kan iedereen het wijzigen en uw formulier gebruiken om mail naar willekeurige adressen te sturen.
Uploads en opgeslagen inzendingen
Bestandsuploads zijn de riskantste formulierfunctie, dus vraag u eerst af of u ze überhaupt nodig hebt. Zo ja, sta dan alleen de typen toe die u werkelijk verwacht – bijvoorbeeld PDF en gangbare afbeeldingsformaten – in plaats van een paar gevaarlijke te blokkeren, en stel een groottelimiet in. Controleer waar de plug-in uploads opslaat: ze mogen niet in een openbare map te zien zijn en bij voorkeur helemaal niet bereikbaar zijn op een te raden adres. Verwijder ze zodra ze zijn afgehandeld, of verstuur ze als bijlage in plaats van ze op de server te bewaren.
Veel formulierplug-ins of hun add-ons slaan elke inzending op in de WordPress-database, vaak inclusief spam. Dat is een nuttige back-up als de mail faalt, maar ook een groeiende stapel persoonsgegevens. Volgens het AVG-beginsel van opslagbeperking (Art. 5(1)(e)) mogen zulke gegevens niet langer worden bewaard dan nodig is. Bepaal of u opgeslagen inzendingen nodig hebt, welke velden en hoe lang, en gebruik dan de instelling voor automatisch verwijderen van de plug-in als die er is, of verwijder oude inzendingen regelmatig. Databaseback-ups bevatten dezelfde gegevens.
Na elke update
- 1Open de contactpagina in een privévenster: het formulier en het antispamelement worden correct weergegeven, en de browserconsole toont geen fouten.
- 2Bekijk de broncode van de pagina: het honeypotveld en het CAPTCHA-script zijn er nog, en het ontvangstadres niet.
- 3Stuur een testbericht: het komt in de inbox terecht, niet in de spam, en de headers tonen dat SPF, DKIM en DMARC slagen.
- 4Controleer de instellingen die ertoe doen: ontvanger, afzenderadres, toegestane uploadtypen en -groottes, hoe lang inzendingen worden bewaard.
- 5Controleer of de link naar de privacyverklaring en eventuele toestemmingsteksten nog bij het formulier worden getoond.
- 6Noteer de datum en wat u hebt gecontroleerd, zodat u weet wanneer het formulier voor het laatst aantoonbaar werkte.
Als het eenmaal routine is, kost dit weinig tijd en vangt het precies de stille storingen op die anders wekenlang onopgemerkt blijven. Voor een blik van buitenaf bekijkt een gratis controle op formexposed.com de openbare formulierpagina’s van een site zonder iets te verzenden en laat zien of de bescherming die u verwacht aanwezig en effectief geconfigureerd is – geen account nodig.