Staat je MailCamp-inschrijfformulier op je website, maar laadt Google reCAPTCHA Enterprise niet? Dan blokkeert de Content Security Policy (CSP) van je website meestal de scripts en frames van Google. Je kunt dat zien door jouw browser console te openen (rechtermuisknop -> Inspecteren -> Console).
Je lost dit op door een paar regels aan je CSP toe te voegen.
Een CSP is een beveiligingsinstelling van je website. Daarmee bepaal je welke scripts, frames, stijlen en verbindingen de browser mag laden. Alles wat niet expliciet is toegestaan, wordt geblokkeerd. Dat is goed voor de veiligheid, maar het blokkeert ook reCAPTCHA als Google niet op de lijst staat.
Je herkent het probleem aan meldingen zoals deze in de browserconsole (F12 → tabblad Console):
Executing inline script violates the following Content Security Policy directive 'script-src-elem' …Loading the script 'https://www.google.com/recaptcha/enterprise.js?render=…' violates the following Content Security Policy directive …Framing 'https://www.google.com/' violates the following Content Security Policy directive: "frame-src" …
Gevolg: het reCAPTCHA-badge verschijnt niet, er wordt geen token aangemaakt en de inschrijving wordt door MailCamp geweigerd.
De CSP stel je in op je eigen webserver of in je CMS (bijvoorbeeld via een security-plugin, .htaccess, Nginx-configuratie of een <meta http-equiv="Content-Security-Policy">-tag). MailCamp kan dit niet voor je aanpassen. Weet je niet waar je CSP staat? Vraag het je websitebouwer of hostingpartij en stuur dit artikel mee.
Welke CSP-regels zijn nodig en waarom?
reCAPTCHA Enterprise heeft vier dingen nodig: Google-scripts laden, een onzichtbaar Google-frame tonen, verbinding maken met Google en het formulier mogen versturen naar MailCamp. Daarnaast bevat het formulier zelf een paar inline scripts en stijlen. Dit zijn de regels die Google zelf adviseert, aangevuld met wat het MailCamp-formulier nodig heeft.
| Directive | Toevoegen | Waarom |
|---|---|---|
script-src (en script-src-elem als je die apart gebruikt) |
https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/
|
Het formulier laadt enterprise.js van www.google.com. Dat script laadt op zijn beurt de rest van reCAPTCHA vanaf www.gstatic.com. |
script-src (inline) |
niets, als je de HTML zonder inline JavaScript gebruikt (zie verderop) | De standaard-HTML bevat inline scripts voor de controle van het formulier en het reCAPTCHA-token. In de variant zonder inline JavaScript staan die in een bestand op je eigen website. |
frame-src (of child-src als je geen frame-src hebt) |
https://www.google.com/recaptcha/ https://recaptcha.google.com/recaptcha/
|
reCAPTCHA draait in een onzichtbaar iframe van Google. Dat is de melding “Framing 'https://www.google.com/' violates … frame-src”. |
connect-src |
https://www.google.com/recaptcha/ |
Het script stuurt via fetch/XHR gegevens naar Google om een token op te halen. |
form-action |
het adres van je MailCamp-omgeving, bijv. https://mail.jouwdomein.nl
|
Het formulier wordt verstuurd naar MailCamp, niet naar je eigen website. Staat form-action op 'self', dan blokkeert de browser het versturen. |
style-src |
niets, als je de HTML zonder inline CSS gebruikt | De standaard-HTML bevat een <style>-blok. Zonder toestemming ziet het formulier er onopgemaakt uit, maar het werkt nog wel. |
img-src |
het adres van je MailCamp-omgeving (alleen als je formulier afbeeldingen gebruikt) | Sommige ontwerpen laden afbeeldingen vanaf MailCamp. |
Let op: elke directive die je niet noemt, valt terug op default-src. Gebruik je alleen default-src 'self', dan moet je de directives hierboven dus allemaal toevoegen.
Gebruik je script-src-elem naast script-src? Dan geldt voor <script>-tags alleen script-src-elem. Zet de Google-domeinen dan ook daar.
Voorbeeld van een complete CSP
Hieronder staat een voorbeeld voor een website die de formulier-HTML zonder inline JavaScript & CSS gebruikt. Vervang mail.jouwdomein.nl door het adres van je MailCamp-omgeving. Voeg de regels toe aan je bestaande CSP; haal niets weg wat je website zelf nodig heeft.
Content-Security-Policy: default-src 'self'; script-src 'self' https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/; frame-src 'self' https://www.google.com/recaptcha/ https://recaptcha.google.com/recaptcha/; connect-src 'self' https://www.google.com/recaptcha/; style-src 'self'; img-src 'self' https://mail.jouwdomein.nl; form-action 'self' https://mail.jouwdomein.nl;
Gebruik je liever de standaard-HTML met een nonce? Zie het alternatief voor ontwikkelaars in de volgende paragraaf. reCAPTCHA Enterprise werkt ook met 'strict-dynamic', zolang enterprise.js de juiste nonce heeft.
Inline JavaScript en CSS: kies de juiste formulier-HTML
Staat je CSP geen 'unsafe-inline' toe? Gebruik dan de formulier-HTML uit het tabblad Geavanceerd. Je vindt de formulier-HTML in MailCamp onder Formulieren: klik bij je formulier op Insluiten en kijk onder het kopje Formulier HTML. Daar staan drie tabbladen:
| Tabblad | Wanneer gebruiken |
|---|---|
| Standaard (aanbevolen) | Je website heeft geen CSP, of je CSP staat 'unsafe-inline' toe. De CSS en het JavaScript staan in de HTML. |
| Standaard zonder opmaak | Als hierboven, maar je wilt dat het formulier de opmaak van je eigen website overneemt. De CSS van het formulier is weggelaten. |
| Geavanceerd | Je CSP staat geen inline CSS en/of geen inline JavaScript toe. |
Onder Geavanceerd staan drie varianten onder elkaar, elk met een eigen kopje:
| Variant | Kies deze als | Wat je krijgt |
|---|---|---|
| Zonder inline CSS |
style-src geen 'unsafe-inline' toestaat |
HTML plus een CSS-bestand mc-form-{id}.css
|
| Zonder inline JavaScript |
script-src geen 'unsafe-inline' toestaat |
HTML plus een JavaScript-bestand mc-form-{id}.js
|
| Zonder inline JavaScript & CSS | allebei | HTML plus beide bestanden |
De melding “Executing inline script violates … 'script-src-elem'” betekent dat je een van de twee varianten zonder inline JavaScript nodig hebt. Het JavaScript-bestand bevat de controle van het formulier en het script dat het reCAPTCHA-token ophaalt. Zonder dat token weigert MailCamp de inschrijving.
Zo plaats je het formulier:
- Open het tabblad Geavanceerd, zoek de variant die bij je CSP past en klik op de downloadlink van het bestand (of de bestanden).
- Zet de bestanden op je eigen website, bijvoorbeeld in de map met je andere stylesheets en scripts. Ze vallen dan onder
'self'in je CSP. - Pas in de HTML het pad aan naar de plek van de bestanden:
hrefin de<link>-regel ensrcin de laatste<script>-regel. De<link>-regel mag ook in de<head>van je pagina. - Laat de
<script>-regel onder het formulier staan. Het script moet na het formulier en na het reCAPTCHA-script van Google worden geladen. - Kopieer de HTML van die variant en plak die in je website.
Pas je het formulier later aan in MailCamp? Download de bestanden dan opnieuw en vervang ze op je website.
Verander verder niets aan de formulier-HTML. De veldnamen, het action-adres en de verborgen velden zijn nodig om de inschrijving te verwerken.
Alternatief voor ontwikkelaars. Wil je de standaard-HTML gebruiken met een strikte CSP? Dan kan dat ook met een nonce: je server zet bij elke paginaweergave dezelfde nonce in de CSP-header en in elke <script>-tag van het formulier. Een hash ('sha256-…') kan ook, maar verandert zodra je het formulier aanpast. Gebruik liever geen 'unsafe-inline' voor scripts: dat zet een groot deel van de bescherming van je CSP uit.
Controleren of het werkt
- Open de pagina met het formulier in een privévenster en druk op F12.
- Kijk in het tabblad Console of er nog meldingen met “Content Security Policy” staan. De melding noemt de directive die nog moet worden aangepast.
- Controleer of rechtsonder op de pagina het reCAPTCHA-badge verschijnt.
- Doe een testinschrijving en controleer of het contact in je MailCamp-lijst staat.
| Melding in de console | Aanpassen |
|---|---|
| Loading the script 'https://www.google.com/recaptcha/…' / 'https://www.gstatic.com/recaptcha/…' | Domeinen toevoegen aan script-src (en script-src-elem) |
| Executing inline script violates … | In het tabblad Geavanceerd de variant Zonder inline JavaScript (of Zonder inline JavaScript & CSS) gebruiken en het JavaScript-bestand plaatsen |
| Framing 'https://www.google.com/' violates … frame-src | Domeinen toevoegen aan frame-src
|
| Connecting to 'https://www.google.com/recaptcha/…' violates … connect-src | Domein toevoegen aan connect-src
|
| Sending form data to '…' violates … form-action | Je MailCamp-adres toevoegen aan form-action
|
| Applying inline style violates … style-src | In het tabblad Geavanceerd de variant Zonder inline CSS (of Zonder inline JavaScript & CSS) gebruiken en het CSS-bestand plaatsen |
Nog een paar aandachtspunten:
-
Meerdere CSP's. Staat er een CSP in de serverheader én in een
<meta>-tag, of zetten twee plugins elk een header? Dan moet een script aan beide voldoen. Pas ze allebei aan, of zorg dat er maar één overblijft. -
Report-Only. Een
Content-Security-Policy-Report-Only-header blokkeert niets; die meldingen kun je negeren. Pas alleen de headerContent-Security-Policyaan. - Caching. Leeg na een wijziging de cache van je CMS of CDN. Anders ziet de bezoeker nog de oude CSP. Gebruik je nonces, zorg dan dat de pagina niet met een vaste nonce in de cache blijft staan.
-
Trusted Types. Gebruik je
require-trusted-types-for 'script'? Test het formulier dan extra goed. Zie je meldingen over Trusted Types, neem dan contact op met je websitebouwer.
Kom je er niet uit? Stuur ons de URL van de pagina en een screenshot van de console-meldingen. Dan kijken we met je mee.
Opmerkingen
0 opmerkingen
U moet u aanmelden om een opmerking te plaatsen.