> For the complete documentation index, see [llms.txt](https://docs.adpage.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.adpage.io/documentation/documentation-nl/website-integraties/magento/content-security-policy-configureren.md).

# Content Security Policy configureren

Het trackingscript van AdPage kan worden geblokkeerd door Content Security Policy. Hoe je precies identificeert wat wordt geblokkeerd en hoe je het in Magento correct toestaat.

Dit artikel is bedoeld voor Magento-ontwikkelaars en IT-teams. Het legt uit waarom het tracking-script van AdPage en je marketingtags kunnen worden geblokkeerd door Content Security Policy (CSP), hoe je precies vaststelt wat er wordt geblokkeerd, en hoe je dit in Magento correct toestaat.

### Wat CSP doet en waarom ons script daarop botst

Content Security Policy is een door de browser afgedwongen allowlist. Het vertelt de browser welke externe bronnen mogen worden geladen en welke inline code mag worden uitgevoerd, waardoor Cross-Site Scripting een stuk moeilijker wordt. Magento wordt geleverd met de CSP-module ingeschakeld en blokkeert in restrict-modus elk extern script dat niet expliciet is toegestaan.

Ons tracking-script moet om twee redenen in die allowlist worden genoemd:

**Het bevat extra JavaScript.** Naast het laden van de container biedt het script functies zoals de Cookie Keeper. Dat is meer dan een standaard vendorsnippet doet, en een deel daarvan draait inline.

**Het laadt vanaf je eigen aangepaste domein.** We leveren tracking via een subdomein van je site, bijvoorbeeld `tagging.yourdomain.com`, geconfigureerd via een CNAME-record in het AdPage-dashboard. Daardoor is de kans veel kleiner dat de aanvraag wordt tegengehouden door gangbare adblockers, maar het betekent ook dat het domein uniek is voor jou en niet vooraf door ons kan worden toegestaan.

Geen van beide kunnen we aan onze kant omzeilen. De allowlist staat in je CSP-header, dus de wijziging moet in Magento plaatsvinden.

### Ontdek wat er echt wordt geblokkeerd

Raad niet naar de domeinlijst. Lees deze af uit de browser.

1. Open de ontwikkelaarstools (F12) en ga naar het **Console** tabblad.
2. Laad een pagina waarop het tracking-script voorkomt (voer indien mogelijk een checkout uit in een testbestelling).
3. Zoek naar CSP-overtredingswaarschuwingen. Elke waarschuwing noemt de geblokkeerde URL en, belangrijk, **welke directive het blokkeerde**, zodat je weet waar de vermelding thuishoort.

Een typische overtreding luidt ongeveer als volgt *"Refused to load the script … because it violates the following Content Security Policy directive: script-src …"*. De directive-naam aan het einde is degene die je moet uitbreiden.

Twee dingen die het waard zijn om te doen terwijl je toch bezig bent:

* Controleer de console opnieuw na een checkout, niet alleen op de homepage. Conversiepixels activeren vaak pas op de orderbevestigingspagina, dus een controle alleen op de homepage mist precies de tags die het belangrijkst zijn.
* Als je winkel CSP in report-only-modus gebruikt, worden overtredingen gelogd in plaats van geblokkeerd. Dat is ideaal om je lijst op te bouwen — maar onthoud dat alles blijft lijken te werken totdat je overschakelt naar restrict-modus.

### De drie manieren waarop CSP tracking breekt

#### 1. Een geblokkeerd domein

**Symptoom:** het script of een pixel laadt nooit, en de console noemt het domein.

**Oorzaak:** het domein staat niet vermeld onder de relevante directive. Dit is CSP zoals het bedoeld is, geen verkeerde configuratie.

**Oplossing:** voeg het domein toe aan de juiste directive. Welke directive dat is, hangt af van hoe de bron wordt geladen:

| Wat wordt geladen                                | Directive                                                            |
| ------------------------------------------------ | -------------------------------------------------------------------- |
| Je tagging-domein (`tagging.yourdomain.com`)     | `script-src`en `connect-src` als events server-side worden verzonden |
| LinkedIn Insight Tag (`px.ads.linkedin.com`)     | `img-src` (en `script-src` voor `snap.licdn.com`)                    |
| Pinterest-tag (`ct.pinterest.com`)               | `img-src` (en `script-src` voor `s.pinimg.com`)                      |
| Elke tag die data verstuurt via `fetch` of `XHR` | `connect-src`                                                        |
| Elke tag die een iframe rendert                  | `frame-src`                                                          |

Beschouw die tabel als een patroon, niet als een volledige lijst. De exacte set domeinen hangt volledig af van wat er in je GTM-container zit, en die verandert wanneer de container verandert. Voeg alleen de domeinen toe die je echt gebruikt.

#### 2. Een geblokkeerd inline script (nonce)

**Symptoom:** het script laadt vanaf een toegestaan domein, maar inline code die het injecteert wordt nooit uitgevoerd.

**Oorzaak:** als je `script-src` directive een nonce bevat, negeert de browser `unsafe-inline` volledig. Vanaf dat moment worden inline scripts alleen uitgevoerd als ze de exacte nonce-waarde uit de huidige response-header dragen. Google Tag Manager en verschillende tracking-scripts injecteren tijdens runtime inline code, dus zij worden hierdoor geraakt.

**Oplossing:** geef de door de server gegenereerde nonce door aan de container-scripttag. De server moet per aanvraag een nieuwe cryptografische nonce genereren, deze opnemen in de CSP-header en dezelfde waarde als attribuut op de tag zetten:

html

```html
<script
    type="text/javascript"
    src="https://www.googletagmanager.com/gtm.js?id=GTM-XXXXXXX"
    nonce="THE_UNIQUE_NONCE_VALUE">
</script>
```

Recente Magento-versies bieden een nonce-provider die je in een block of template kunt injecteren in plaats van er zelf een te genereren — raadpleeg de Adobe-documentatie voor jouw specifieke versie voordat je dit zelf bouwt.

Wees je ervan bewust dat onder een strikt nonce-gebaseerd beleid, **Custom HTML-tags en Custom JavaScript-variabelen in GTM helemaal kunnen stoppen met werken**, omdat GTM de nonce van je server niet kan koppelen aan code die het tijdens runtime schrijft. Als een tag afhankelijk is van Custom HTML, plan dan om die logica server-side te verplaatsen of het beleid daarvoor bewust te versoepelen.

#### 3. Geblokkeerde `eval`

**Symptoom:** de container laadt, maar preview-modus of bepaalde custom templates falen met een `unsafe-eval` overtreding.

**Oorzaak:** sommige tag-templates en GTM's eigen debug-tools evalueren code tijdens runtime.

**Oplossing:** er is geen nette. Toestaan van `unsafe-eval` verzwakt het beleid aanzienlijk, dus het is de moeite waard om eerst te controleren of de tag een alternatieve implementatie heeft. Als je dit alleen in preview-modus ziet, kun je er vaak mee leven en de tag op een andere manier valideren.

### De wijziging in Magento doorvoeren

Magento's CSP-configuratie wordt via code beheerd, niet iets wat je in een template moet aanpassen. Voeg allowlist-vermeldingen toe via een `csp_whitelist.xml` bestand in je eigen module of thema — nooit door core-bestanden te bewerken:

xml

```xml
<?xml version="1.0"?>
<csp_whitelist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Csp:etc/csp_whitelist.xsd">
    <policies>
        <policy id="script-src">
            <values>
                <value id="adpage_tagging" type="host">tagging.yourdomain.com</value>
            </values>
        </policy>
        <policy id="connect-src">
            <values>
                <value id="adpage_tagging_connect" type="host">tagging.yourdomain.com</value>
            </values>
        </policy>
    </policies>
</csp_whitelist>
```

Plaats het in `app/code/YourVendor/YourModule/etc/`, en flush daarna de configcache. Een paar dingen om in gedachten te houden:

* Storefront en admin hebben **gescheiden** beleidsregels. Tracking hoort bij de storefront; het correct afbakenen voorkomt dat de admin onnodig wordt versoepeld.
* Restrict-modus versus report-only-modus is per gebied configureerbaar. Rol je allowlist uit terwijl je in report-only-modus zit, bevestig dat de console stil is, en handhaaf pas daarna.
* Adobe's documentatie is leidend voor de details en versieverschillen: [Content Security Policies in Adobe Commerce](https://developer.adobe.com/commerce/php/development/security/content-security-policies/). Als je dit overdraagt aan iemand anders, is die link plus je domeinlijst alles wat nodig is.

Test na het uitrollen grondig opnieuw: laad de site, verstuur een formulier, voltooi een testbestelling en bevestig in GTM preview-modus dat elke tag nog steeds afgaat.

### Deze lijst raakt verouderd

GTM-containers veranderen vaker dan CSP-headers, en zo breekt tracking stilletjes maanden na een werkende implementatie. Bouw er een kleine gewoonte omheen:

* Controleer regelmatig de browserconsole op nieuwe CSP-waarschuwingen, niet alleen na een incident.
* Wanneer je een marketingtag toevoegt, controleer dan of die een nieuw domein introduceert voordat je de container publiceert.
* Beschouw een CSP-update als onderdeel van het werk wanneer nieuwe trackingfunctionaliteit wordt uitgerold.

### Nog steeds vastgelopen?

Als tags geblokkeerd blijven nadat je de allowlist hebt geconfigureerd, mail <support@adpage.io> en voeg toe:

* Je huidige CSP-configuratie, of de response-header zelf
* De exacte console-overtredingen, gekopieerd in plaats van geparafraseerd
* Welke tags niet werken, en op welke pagina's

Die combinatie stelt ons meestal in staat om de ontbrekende directive in het eerste antwoord te pinpointen.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.adpage.io/documentation/documentation-nl/website-integraties/magento/content-security-policy-configureren.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
