Je winkelwagen is leeg
Producten die je toevoegt, verschijnen hier.
Zo configureer je een contactformulier veilig op je hosting: spamvrij zonder reCAPTCHA, AVG-proof, zonder header-injectie en met mail die wél aankomt.
Samenvatting: contactformulier veilig configureren op hosting
Zet je eigen domein in het From-veld en de bezoeker in Reply-To, haal regelafbrekingen uit alles wat in een mailheader komt en verstuur via geauthenticeerde SMTP met SPF, DKIM en DMARC op orde. Weer spam eerst met een honeypot, tijdscheck en rate limiting in plaats van Google reCAPTCHA, vraag alleen naam, e-mail en bericht, en verwijs bij het formulier naar je privacyverklaring. Test daarna met een mail naar Gmail en Outlook en lees de headers op SPF, DKIM en DMARC "pass".
Een contactformulier veilig configureren op hosting draait om drie dingen: het formulier mag geen spamrelais worden, de mail moet in de inbox aankomen en je verwerkt persoonsgegevens volgens de AVG
KeurigOnline zegtAVGDe AVG (Algemene verordening gegevensbescherming) is de Europese privacywet die regelt hoe je persoonsgegevens mag verwerken.. Het lijkt het simpelste onderdeel van je site, maar het is ook een open deur. Iedereen kan er invoer in stoppen, en je server verstuurt die invoer als e-mail namens jouw domein.
Gaat dat mis, dan merk je het op drie manieren. Bots misbruiken je formulier om spam te versturen, waarna je domein op blocklists belandt. Echte aanvragen verdwijnen ongezien in de spammap. Of je laadt scripts en bewaart gegevens waar je bezoeker nooit van heeft gehoord. Hieronder vind je zeven veelgemaakte fouten, per fout de oplossing, en een testroutine waarmee je in tien minuten controleert of jouw formulier deugt.

Flexahosting zette onlangs op een rij wat je hosting moet kunnen voordat je formulieren, mail en SSL gebruikt[1]. Dat is een bruikbare lijst: SMTP
KeurigOnline zegtSMTPSMTP (Simple Mail Transfer Protocol) is het protocol waarmee mailprogramma's en mailservers e-mail versturen. met authenticatie, de poorten 587 en 465, SPF, DKIM
KeurigOnline zegtDKIMDKIM beveiligt e-mails met een digitale handtekening om spam tegen te gaan. en DMARC
KeurigOnline zegtDMARCDMARC is een e-mailbeveiligingsprotocol dat domeinen beschermt tegen phishing en spoofing via SPF en DKIM., en een SSL
KeurigOnline zegtSSLSSL (Secure Sockets Layer) is een beveiligingsprotocol voor versleutelde internetverbindingen.-certificaat. Zonder die bouwstenen begin je niet.
Toch zitten de meeste problemen niet in de hosting, maar in het formulier zelf. Welk adres staat er in het From-veld? Wat gebeurt er met een regelafbreking in het naamveld? Welk script laadt je captcha
KeurigOnline zegtCaptchaCaptcha is een beveiligingstest die onderscheid maakt tussen mensen en geautomatiseerde programma's (bots)., en hoe lang bewaar je de inzendingen? Dat bepaal jij, of de plugin
KeurigOnline zegtPluginEen plugin is een uitbreiding die je aan software zoals WordPress toevoegt om er een nieuwe functie bij te krijgen. die je installeert.
Die plugins verdienen extra aandacht. Patchstack telde in 2025 11.334 nieuwe kwetsbaarheden in het WordPress
KeurigOnline zegtWordPressWordPress is een open-source contentmanagementsysteem (CMS) geschreven in PHP, waarmee je eenvoudig websites en blogs kunt bouwen en beheren.-ecosysteem, 42% meer dan in 2024. Daarvan zat 91% in plugins, en voor 46% was er nog geen fix op het moment dat het lek openbaar werd[2]. Formulierplugins horen daar gewoon bij. Elke plugin die je niet nodig hebt, is een lek dat je niet hoeft te patchen.
Het formulier is één onderdeel van je totale beveiliging. Voor het bredere plaatje gebruik je onze website beveiliging checklist voor het mkb.
Een formulier dat over HTTP
KeurigOnline zegtHTTPHTTP (HyperText Transfer Protocol) is het protocol dat de communicatie tussen webclients en servers mogelijk maakt. verstuurt, stuurt namen, e-mailadressen en berichten leesbaar over het netwerk. Iedereen die het verkeer onderweg kan meelezen, zoals op een openbaar wifi-netwerk, ziet precies wat je bezoeker typt.
Alleen de pagina op HTTPS
KeurigOnline zegtHTTPSHTTPS (HyperText Transfer Protocol Secure) is HTTP over een versleutelde TLS-verbinding tussen browser en webserver. zetten is niet genoeg. Controleer ook:
action-URL van het formulier: die moet met https:// beginnen;Zo test je het: open je formulierpagina, klik op het slotje in de adresbalk en kijk of de verbinding als beveiligd wordt aangemerkt zonder meldingen. Open de ontwikkelaarstools (F12) en zoek in de console naar "Mixed Content". Controleer het certificaat zelf, inclusief vervaldatum en keten, met sslscan.nl.
Bij KeurigOnline zit een gratis SSL-certificaat bij elk hostingpakket, dus dit is de makkelijkste fout om op te lossen.

Dit is de meest gemaakte formulierfout, en de eerste oorzaak om te controleren als je contactformulier in de spam komt. Het formulier verstuurt de mail met From: bezoeker@gmail.com, zodat je in je mailprogramma meteen op "beantwoorden" kunt klikken. Handig bedacht, maar jouw server is geen Gmail-server. De ontvangende mailserver controleert het From-domein, ziet dat gmail.com jouw server niet heeft geautoriseerd en de DMARC-controle van gmail.com faalt[4]. Gevolg: spammap of een harde weigering.
De grote mailproviders zijn hier streng in. Gmail stelt sinds 1 februari 2024 eisen aan alle afzenders: SPF of DKIM, een geldige PTR-record
KeurigOnline zegtPTR-recordEen PTR-record vertaalt een IP-adres naar een domeinnaam (reverse DNS) en is cruciaal voor e-mailbeveiliging., TLS
KeurigOnline zegtTLSTLS is het standaardprotocol voor versleutelde, betrouwbare communicatie tussen client en server., een spamratio onder 0,3% en geen nagemaakte From-headers[3]. Outlook.com stelt sinds 5 mei 2025 vergelijkbare eisen aan bulkafzenders en weigert niet-conforme mail met de foutcode 550 5.7.515[5]. Sommige hostingproviders laten formuliermail zelfs alleen door als het From-adres op het eigen domein eindigt[6].
Zet je eigen domein in From en de bezoeker in Reply-To. "Beantwoorden" werkt dan nog steeds, want je mailprogramma gebruikt automatisch het Reply-To-adres.
# Afzender: altijd een adres op je eigen domein
From: Contactformulier <formulier@jouwdomein.nl>
# Antwoorden gaat naar de bezoeker
Reply-To: jan@gmail.com
# Ontvanger: vast in de code, nooit uit het formulier
To: info@jouwdomein.nlGebruik je WordPress, dan stel je dit in de plugin in. In Contact Form 7 staat het onder het tabblad "E-mail", in WPForms en Gravity Forms onder de meldingsinstellingen. Vul bij "Van" een adres op je eigen domein in en zet het e-mailveld van de bezoeker bij "Reply-To" (in Contact Form 7 via de regel Reply-To: [your-email] bij extra headers).
Bij PHP
KeurigOnline zegtPHPPHP (Hypertext Preprocessor) is een populaire open-source scripttaal die speciaal is ontworpen voor webontwikkeling en server-side programmering. mail header-injectie misbruikt een aanvaller het feit dat mailheaders gescheiden worden door een regelafbreking (\r\n). Stop je de invoer van een naam-, onderwerp- of e-mailveld ongefilterd in de headers, dan kan een bot daar een regelafbreking plus Bcc: duizend-adressen in zetten. Jouw formulier verstuurt dan keurig zijn spam, vanaf jouw server en namens jouw domein[7].
Het gevolg merk je pas later. Je domein en het IP-adres
KeurigOnline zegtIP-adresEen IP-adres (Internet Protocol-adres) is het nummer waarmee een apparaat op een netwerk of internet bereikbaar is. van de server komen op blocklists, en daarna komt ook je gewone zakelijke mail niet meer aan.
// FOUT: invoer rechtstreeks in de headers en een ontvanger uit een verborgen veld
$headers = "From: " . $_POST['email'];
mail($_POST['to'], $_POST['onderwerp'], $bericht, $headers);
// GOED: vaste ontvanger, gevalideerd adres, geen regelafbrekingen in headers
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
if ($email === false) { exit('Vul een geldig e-mailadres in.'); }
$naam = str_replace(["\r", "\n"], '', $_POST['naam'] ?? '');
$headers = "From: formulier@jouwdomein.nl\r\nReply-To: " . $email;
mail('info@jouwdomein.nl', 'Contactformulier: ' . $naam, $bericht, $headers);De vier regels die je formulier dichtzetten:
\r en \n weg uit alles wat in een header of het onderwerp terechtkomt.filter_var(..., FILTER_VALIDATE_EMAIL); een adres met een regelafbreking erin valt dan al af.mail()-argument nooit met gebruikersinvoer. Dat argument gaat als parameters naar het verzendprogramma van de server en is een bekende ingang voor misbruik[7].Bij ons op de server zitten een uitgaande spamfilter
KeurigOnline zegtSpamfilterEen spamfilter is software die binnenkomende e-mail beoordeelt en ongewenste berichten (spam) apart zet of tegenhoudt. en een dagelijkse e-maillimiet: 500 bij Start, 1.000 bij Plus en 2.000 bij Pro (zie onze webhostingpakketten). Dat beperkt de schade van een misbruikt formulier, maar vervangt geen veilig formulier. Heb je structureel meer mail nodig, lees dan wanneer een VPS of shared hosting beter past.
Een required-attribuut of een JavaScript
KeurigOnline zegtJavaScriptJavaScript is een programmeertaal die wordt gebruikt om interactieve en dynamische websites te maken.-check zorgt ervoor dat een mens geen leeg veld verstuurt. Een bot gebruikt je formulier niet: die stuurt een POST-verzoek rechtstreeks naar je verwerkingsscript. Validatie in de browser is dus gebruiksgemak, beveiliging doe je op de server.
Controleer daarom server-side:
htmlspecialchars(). Anders voert een ingestuurd script zich uit in jouw browser (XSSEen CSRF-token bewijst dat de inzending van jouw eigen formulierpagina komt en niet van een andere site of een script dat blind post. In WordPress gebruik je daarvoor nonces (wp_nonce_field() en wp_verify_nonce()); de bekende formulierplugins doen dat al voor je. In een eigen script ziet het er zo uit:
// Bij het tonen van het formulier: token in de sessie en in een verborgen veld
$_SESSION['csrf'] = bin2hex(random_bytes(32));
// Bij het verwerken: token vergelijken, anders stoppen
if (!hash_equals($_SESSION['csrf'] ?? '', $_POST['csrf'] ?? '')) {
exit('Verlopen formulier, laad de pagina opnieuw.');
}Google reCAPTCHA is de standaardreflex om contactformulier spam te voorkomen. Ook in lijstjes met hostingeisen staat "reCAPTCHA of hCaptcha" zonder kanttekening. Maar reCAPTCHA laadt resources van Google-servers in de VS, vaak al op het moment dat de bezoeker de pagina opent, nog voordat hij iets invult. De voorzichtige lijn is daarom om reCAPTCHA onder toestemming te laten vallen[8].
In Duitsland wordt in dit verband een uitspraak van het Landgericht Köln van 23 maart 2023 (33 O 376/22) aangehaald tegen Google-diensten die zonder toestemming worden ingeladen[9]. Dat is een Duits signaal en geen Nederlandse norm, maar wel een reden om reCAPTCHA AVG-technisch niet als vanzelfsprekend te zien.
Voor veel kleine websites volstaat een server-side honeypot met rate limiting[8]. Een honeypot in je contactformulier is een veld dat mensen niet zien en bots wel invullen:
<!-- Buiten beeld, niet bereikbaar met de tab-toets, genegeerd door schermlezers -->
<div style="position:absolute; left:-9999px;" aria-hidden="true">
<label for="website">Laat dit veld leeg</label>
<input type="text" id="website" name="website" tabindex="-1" autocomplete="off">
</div>Combineer dat met twee checks op de server:
// Honeypot ingevuld of te snel verstuurd: stil weigeren, de bot leert er niets van
if (!empty($_POST['website']) || time() - ($_SESSION['form_start'] ?? 0) < 3) {
exit;
}Wees eerlijk over de grenzen: een honeypot houdt de massa geautomatiseerde spam tegen, geen bot die speciaal op jouw site is afgesteld. Komt er dan nog veel door, kies een alternatief zoals Cloudflare
KeurigOnline zegtCloudflareCloudflare is een Amerikaans bedrijf dat als reverse proxy vóór websites staat en DNS, een CDN en beveiliging levert. Turnstile, hCaptcha of Friendly Captcha[8]. Ook die verwerken gegevens, dus noem ze in je privacyverklaring. En elk extern script kost laadtijd: lees waarom websitesnelheid en SEO daar gevoelig voor zijn.
Een contactformulier AVG-proof maken is minder werk dan veel mensen denken. Er zijn drie punten waar het meestal misgaat.
Voor een contactvraag heb je een naam, een e-mailadres
KeurigOnline zegtE-mailadresEen e-mailadres is een uniek digitaal adres in het formaat naam@domein.nl voor het versturen en ontvangen van elektronische berichten. en het bericht nodig. Een telefoonnummer maak je optioneel. Geboortedatum, adres of bedrijfsgrootte horen er niet in, tenzij je ze echt gebruikt om de vraag te beantwoorden. Elk extra veld is een gegeven dat je moet beschermen, en een reden voor de bezoeker om af te haken.
Volgens de Autoriteit Persoonsgegevens is een duidelijke verwijzing naar je online privacyverklaring bij het formulier genoeg om aan je informatieplicht te voldoen[10]. De grondslag voor het beantwoorden van een contactvraag is meestal gerechtvaardigd belang[12]. Een verplicht vinkje "ik ga akkoord met de privacyverklaring" is daarvoor niet nodig. Een korte zin onder de verzendknop werkt beter: "We gebruiken je gegevens alleen om je vraag te beantwoorden. Lees onze privacyverklaring."
De AVG noemt geen vaste bewaartermijn. Je bewaart persoonsgegevens niet langer dan nodig, legt je termijn vast en zet hem in je privacyverklaring[11]. Veel formulierplugins slaan elke inzending ook op in de database
KeurigOnline zegtDatabaseEen database is een georganiseerde verzameling gegevens die elektronisch wordt opgeslagen en beheerd., zoals Flamingo bij Contact Form 7 of de entries van WPForms. Krijg je de inzending toch al per mail, zet dat opslaan dan uit of ruim de database periodiek op.
Werk je met veel persoonsgegevens, zoals bij hosting voor een vereniging met aanmeldformulieren voor leden, dan wordt dit punt nog belangrijker.
De PHP-functie mail() geeft je bericht af aan het lokale verzendprogramma van de server, zonder in te loggen op een mailbox. Beter is geauthenticeerde SMTP: je formulier logt in met een bestaand mailadres op je eigen domein, via poort
KeurigOnline zegtPoortEen poort is een nummer van 0 tot 65535 waarmee een computer netwerkverkeer naar de juiste dienst stuurt, zoals 443 voor HTTPS. 465 (SSL) of 587 (STARTTLS). Voor een SMTP contactformulier in WordPress installeer je een SMTP-plugin en vul je daar de gegevens van dat mailadres in. In eigen code gebruik je een bibliotheek zoals PHPMailer of Symfony Mailer.
// PHPMailer: inloggen op een echt mailadres op je eigen domein
$mail = new PHPMailer\PHPMailer\PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp-server-uit-je-hostinggegevens';
$mail->SMTPAuth = true;
$mail->Username = 'formulier@jouwdomein.nl';
$mail->Password = getenv('FORM_MAIL_PASS'); // wachtwoord niet in de code
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;Je DNS-records beheer je bij ons in DirectAdmin
KeurigOnline zegtDirectAdminDirectAdmin is een webhosting control panel ontwikkeld door JBMC Software als kostenefficiënt en gebruiksvriendelijk alternatief voor cPanel.. Controleer daarna met dnsscan.nl of SPF, DKIM en DMARC kloppen. Voor een webshop speelt hetzelfde op grotere schaal, met bestelbevestigingen die écht moeten aankomen: zie ons artikel over hosting voor je webshop.
Een formulier dat een bevestiging toont, is nog geen formulier dat werkt. Loop na elke wijziging, en minstens na elke grote plugin-update, deze routine door.
Contactformulier testen in 5 stappen
spf=pass, dkim=pass en dmarc=pass zien, met je eigen domein in From en de bezoeker in Reply-To.Bcc: een-tweede-adres-van-jou. Komt er een kopie aan op dat tweede adres, dan is je formulier lek.| Symptoom | Waarschijnlijke oorzaak | Oplossing |
|---|---|---|
| Contactformulier komt in spam | Adres van de bezoeker in From, of SPF/DKIM/DMARC niet op orde | Eigen domein in From, bezoeker in Reply-To; DNS controleren met dnsscan.nl |
| Mail komt helemaal niet aan | mail() zonder authenticatie, of de ontvanger weigert stil | Overstappen op geauthenticeerde SMTP via poort 465 of 587 |
Bounce met 550 5.7.515 | Outlook.com weigert omdat SPF, DKIM of DMARC niet klopt | De drie records nalopen; één SPF-record, maximaal 10 lookups |
| Plotseling veel spam via het formulier | Bots hebben je formulier gevonden, of een plugin is lek | Honeypot, tijdscheck en rate limiting toevoegen; plugin bijwerken |
| Formulier geeft geen melding of een witte pagina | PHP-fout in het script of de plugin | De PHP-foutlog van je pakket bekijken en het formulier opnieuw testen |
Houd tot slot je formulierplugin bij. Bij de zwaarst aangevallen WordPress-lekken lag de mediane tijd tot massaal misbruik op 5 uur na bekendmaking[13]. Automatische updates voor plugins zijn daarom geen luxe.
action-URL draaien op HTTPS\r of \n in headers, e-mailadressen gevalideerd, ontvanger vast in de code.Bij KeurigOnline krijg je gratis SSL, een uitgaande spamfilter
KeurigOnline zegtSpamfilterEen spamfilter is software die binnenkomende e-mail beoordeelt en ongewenste berichten (spam) apart zet of tegenhoudt. en DNS-beheer in DirectAdmin
KeurigOnline zegtDirectAdminDirectAdmin is een webhosting control panel ontwikkeld door JBMC Software als kostenefficiënt en gebruiksvriendelijk alternatief voor cPanel. bij elk pakket. Imunify360
KeurigOnline zegtImunify360Imunify360 is een uitgebreide beveiligingssuite voor Linux webservers met AI-aangedreven malware scanning. is bij een VPS
KeurigOnline zegtVPSEen VPS is een eigen virtuele server met meer vrijheid en flexibiliteit dan shared hosting. optioneel en niet standaard inbegrepen. Wil je het onderhoud van je WordPress-site liever uitbesteden? Ons WordPress-onderhoud Standaard (€45 per maand) bevat spam protectie, Uitgebreid (€75 per maand) ook externe SMTP voor mail. Vragen over je formulier? Mail onze support, ma-vr van 09:00 tot 21:00.
Niet zonder meer. Google reCAPTCHA laadt resources van Google-servers in de VS, vaak al bij het openen van de pagina. De voorzichtige lijn is reCAPTCHA pas na toestemming te laden, of een alternatief te kiezen: eerst een honeypot met tijdscheck en rate limiting, en pas als dat niet genoeg is Cloudflare
KeurigOnline zegtCloudflareCloudflare is een Amerikaans bedrijf dat als reverse proxy vóór websites staat en DNS, een CDN en beveiliging levert. Turnstile, hCaptcha of Friendly Captcha, vermeld in je privacyverklaring.
Meestal door een van drie oorzaken: het adres van de bezoeker staat in From (DMARC faalt), het formulier verstuurt met mail() zonder authenticatie, of SPF, DKIM
KeurigOnline zegtDKIMDKIM beveiligt e-mails met een digitale handtekening om spam tegen te gaan. en DMARC
KeurigOnline zegtDMARCDMARC is een e-mailbeveiligingsprotocol dat domeinen beschermt tegen phishing en spoofing via SPF en DKIM. zijn niet op orde, bijvoorbeeld door twee SPF-records of meer dan 10 DNS
KeurigOnline zegtDNSHet Domain Name System (DNS) vertaalt domeinnamen naar IP-adressen, zodat websites makkelijk bereikbaar zijn.-lookups. Zet je eigen domein in From, de bezoeker in Reply-To en verstuur via geauthenticeerde SMTP.
Meestal niet. Voor het beantwoorden van een contactvraag is gerechtvaardigd belang de gebruikelijke grondslag. Volgens de Autoriteit Persoonsgegevens is een duidelijke verwijzing naar je privacyverklaring bij het formulier genoeg om je bezoeker te informeren.
De AVG
KeurigOnline zegtAVGDe AVG (Algemene verordening gegevensbescherming) is de Europese privacywet die regelt hoe je persoonsgegevens mag verwerken. noemt geen vaste termijn: zo kort als nodig voor het doel. Leg je bewaartermijn vast, zet hem in je privacyverklaring en ruim inzendingen die je plugin in de database
KeurigOnline zegtDatabaseEen database is een georganiseerde verzameling gegevens die elektronisch wordt opgeslagen en beheerd. opslaat periodiek op, of zet dat opslaan uit.
Ja, tegen de massa geautomatiseerde spambots, zeker in combinatie met een tijdscheck en rate limiting per IP-adres
KeurigOnline zegtIP-adresEen IP-adres (Internet Protocol-adres) is het nummer waarmee een apparaat op een netwerk of internet bereikbaar is.. Tegen een bot die speciaal op jouw site is afgesteld werkt een honeypot niet. Voeg in dat geval een privacyvriendelijke captcha
KeurigOnline zegtCaptchaCaptcha is een beveiligingstest die onderscheid maakt tussen mensen en geautomatiseerde programma's (bots). toe.
Ja. Een klein PHP
KeurigOnline zegtPHPPHP (Hypertext Preprocessor) is een populaire open-source scripttaal die speciaal is ontworpen voor webontwikkeling en server-side programmering.-script met server-side validatie, een honeypot, een CSRF-token en een SMTP
KeurigOnline zegtSMTPSMTP (Simple Mail Transfer Protocol) is het protocol waarmee mailprogramma's en mailservers e-mail versturen.-bibliotheek zoals PHPMailer is genoeg. Minder plugins betekent minder aanvalsoppervlak, want 91% van de WordPress
KeurigOnline zegtWordPressWordPress is een open-source contentmanagementsysteem (CMS) geschreven in PHP, waarmee je eenvoudig websites en blogs kunt bouwen en beheren.-kwetsbaarheden in 2025 zat in plugins. Je bent dan wel zelf verantwoordelijk voor het onderhoud van je script.
Poort 465 met SSL
KeurigOnline zegtSSLSSL (Secure Sockets Layer) is een beveiligingsprotocol voor versleutelde internetverbindingen. of poort
KeurigOnline zegtPoortEen poort is een nummer van 0 tot 65535 waarmee een computer netwerkverkeer naar de juiste dienst stuurt, zoals 443 voor HTTPS. 587 met STARTTLS, altijd met authenticatie via een bestaand mailadres op je eigen domein. Beide versleutelen de verbinding; kies wat je plugin
KeurigOnline zegtPluginEen plugin is een uitbreiding die je aan software zoals WordPress toevoegt om er een nieuwe functie bij te krijgen. of bibliotheek het makkelijkst ondersteunt.