Content Security Policy i el teu CMP: com fer que CSP i consentiment funcionin junts
Dues capes de seguretat que han d'estar d'acord
Una Content Security Policy (CSP) diu al navegador des de quines fonts pot una pàgina carregar scripts, estils, imatges, frames i sol·licituds de xarxa. Una plataforma de gestió del consentiment fa la feina contrària: decideix quins d'aquests scripts poden executar-se segons l'elecció de l'usuari. Quan es configuren per separat, col·lisionen. El CMP no es carrega perquè la CSP el bloqueja, o la CSP s'afluixa tant per acomodar el CMP i les etiquetes d'anuncis que ja no protegeix res.
Aquesta guia explica quines directives de CSP sol necessitar un CMP, com interactuen els nonces amb la injecció d'scripts i com desplegar canvis sense trencar el bàner.
Què sol necessitar un CMP de la CSP
Els requisits exactes depenen del proveïdor, així que parteix sempre de la documentació del teu CMP. En general, comprova aquestes directives:
script-src— el domini des del qual es carrega l'script del CMP, més qualsevol altre fitxer d'script que carregui.connect-src— els punts finals que el CMP crida ambfetcho XHR, com els de configuració, llista de proveïdors, geolocalització i registre del consentiment.style-src— el domini del full d'estils, i possiblement els estils en línia si el CMP injecta un element<style>o defineix atributs d'estil.img-src— logotips, icones i qualsevol píxel sense seguiment que faci servir el CMP.font-src— si el bàner carrega les seves pròpies tipografies.frame-src— si el CMP fa servir iframes, per exemple per compartir el consentiment entre dominis.
En llocs amb TCF, recorda que el CMP també crea un frame localitzador anomenat __tcfapiLocator a la pàgina. Aquest frame es crea sense font remota, de manera que normalment no necessita una entrada a frame-src, però convé confirmar-ho en les proves.
El problema de l'stub en línia
La majoria de CMP et demanen que posis un petit script en línia — l'stub — al head de la pàgina, perquè altres scripts puguin posar crides en cua abans que es carregui el CMP principal. Una CSP estricta bloqueja els scripts en línia tret que els permetis explícitament. Tens tres opcions:
- Un nonce. Genera un valor aleatori per resposta, afegeix-lo a la capçalera CSP com a
'nonce-...'i a l'etiqueta<script>de l'stub. És l'opció més flexible per a pàgines dinàmiques. - Un hash. Afegeix el hash SHA-256 del contingut exacte de l'stub a
script-src. Funciona bé per a llocs estàtics, però qualsevol canvi a l'stub, fins i tot d'espais en blanc, el trenca. - Allotjar l'stub pel teu compte com a fitxer extern al teu propi domini, cobert per
'self'. Cal anar amb compte perquè es carregui prou aviat.
Evita 'unsafe-inline' com a drecera. Permet tots els scripts en línia, cosa que elimina gran part de la protecció que ofereix la CSP.
Nonces i scripts que injecta el CMP
Un CMP que bloqueja scripts fins al consentiment sovint funciona retenint-los i injectant-los més tard. Amb una CSP basada en nonces, aquests scripts injectats també s'han de permetre. Hi ha dos enfocaments habituals:
- Propagació del nonce. El CMP llegeix el nonce de la seva pròpia etiqueta d'script i l'afegeix a cada script que injecta. Comprova si el teu CMP ho admet.
'strict-dynamic'. Aquesta paraula clau indica als navegadors compatibles que confiïn en els scripts carregats per un script ja de confiança. Simplifica la vida amb gestors d'etiquetes i CMP que injecten scripts, però també vol dir que qualsevol script en què confiïs pot carregar-ne d'altres, així que confia amb cura.
Els gestors d'etiquetes plantegen la mateixa qüestió. Si carregues etiquetes d'anuncis i d'analítica mitjançant un gestor d'etiquetes, segueix la seva documentació sobre nonces i assegura't que el CMP i el gestor d'etiquetes facin servir un enfocament coherent.
Les etiquetes d'anuncis compliquen la CSP
La publicitat programàtica carrega scripts i frames de molts dominis, i la llista canvia a mesura que canvien els socis de demanda. Els editors solen fer una d'aquestes dues eleccions:
- Una CSP estricta a les pàgines sense anuncis programàtics, i una política més àmplia allà on s'executen anuncis.
- Una política centrada en directives que continuen sent manejables, com
frame-ancestors,object-src 'none'ibase-uri, mentre que les fonts d'scripts es mantenen més àmplies.
En qualsevol cas, el CMP hauria d'estar a la llista de permesos explícita, no cobert només per un comodí, perquè un canvi de CSP mai no desactivi el bàner en silenci.
Desplega amb el mode només informe
Fes servir primer la capçalera Content-Security-Policy-Report-Only. El navegador informa de les violacions sense bloquejar res, de manera que pots veure què trencaria una política nova.
- Desplega la política en mode només informe amb un punt final d'informes.
- Carrega pàgines en perfils de navegador nets i recorre tot el flux de consentiment: primera visita, acceptar-ho tot, rebutjar-ho tot, elecció personalitzada, retirada.
- Revisa els informes de violacions i la consola del navegador per detectar recursos del CMP bloquejats.
- Ajusta la política i després passa a l'aplicació efectiva.
- Mantén els informes activats després de l'aplicació per detectar regressions.
Símptomes d'un conflicte de CSP
- El bàner no apareix mai, i la consola mostra una violació de CSP per a l'script del CMP.
- El bàner apareix però sense estils, perquè
style-srcbloqueja el seu CSS. - Les eleccions no es desen, perquè
connect-srcbloqueja la crida de registre del consentiment. - Els anuncis o l'analítica no es carreguen mai després del consentiment, perquè als scripts injectats els falta un nonce.
__tcfapino està definit, perquè l'stub en línia s'ha bloquejat.
Idees clau
- Comprova
script-src,connect-src,style-src,img-srciframe-srcper al teu CMP. - Permet l'stub en línia amb un nonce o un hash, no amb
'unsafe-inline'. - Assegura't que els scripts injectats després del consentiment rebin un nonce o quedin coberts per
'strict-dynamic'. - Prova cada camí de consentiment en mode només informe abans d'aplicar la política.
- Mantén el CMP a la llista de permesos de manera explícita perquè els canvis de CSP no el puguin desactivar.