Content Security Policy și CMP-ul tău: cum faci CSP și consimțământul să funcționeze împreună
Două straturi de securitate care trebuie să se înțeleagă
O Content Security Policy (CSP) îi spune browserului din ce surse poate o pagină să încarce scripturi, stiluri, imagini, cadre și cereri de rețea. O platformă de gestionare a consimțământului face treaba opusă: decide care dintre acele scripturi au voie să ruleze în funcție de alegerea utilizatorului. Când sunt configurate separat, se ciocnesc. CMP-ul nu se încarcă pentru că CSP îl blochează sau CSP este relaxată atât de mult pentru a găzdui CMP-ul și tagurile de reclame încât nu mai protejează nimic.
Acest ghid explică ce directive CSP are de obicei nevoie un CMP, cum interacționează nonce-urile cu injectarea de scripturi și cum faci modificări fără să strici bannerul.
Ce are de obicei nevoie un CMP de la CSP
Cerințele exacte depind de furnizor, așa că pornește mereu de la documentația propriului CMP. În general, verifică aceste directive:
script-src— domeniul din care se încarcă scriptul CMP, plus orice alte fișiere de script pe care le încarcă.connect-src— punctele finale pe care CMP-ul le apelează cufetchsau XHR, precum cele pentru configurare, lista de furnizori, geolocalizare și înregistrarea consimțământului.style-src— domeniul foii de stil și, eventual, stilurile inline dacă CMP-ul injectează un element<style>sau setează atribute de stil.img-src— logo-uri, pictograme și orice pixeli fără urmărire folosiți de CMP.font-src— dacă bannerul își încarcă propriile fonturi.frame-src— dacă CMP-ul folosește iframe-uri, de exemplu pentru partajarea consimțământului între domenii.
Pe site-urile cu TCF, nu uita că CMP-ul creează în pagină și un cadru de localizare numit __tcfapiLocator. Acel cadru este creat fără sursă la distanță, deci în mod normal nu are nevoie de o intrare în frame-src, dar merită confirmat la testare.
Problema stub-ului inline
Majoritatea CMP-urilor îți cer să pui un mic script inline — stub-ul — în head-ul paginii, astfel încât alte scripturi să poată pune apeluri în coadă înainte să se încarce CMP-ul principal. O CSP strictă blochează scripturile inline, dacă nu le permiți explicit. Ai trei opțiuni:
- Un nonce. Generează o valoare aleatorie pentru fiecare răspuns, adaug-o în antetul CSP ca
'nonce-...'și în eticheta<script>a stub-ului. Aceasta este cea mai flexibilă opțiune pentru paginile dinamice. - Un hash. Adaugă hash-ul SHA-256 al conținutului exact al stub-ului în
script-src. Funcționează bine pentru site-uri statice, dar orice modificare a stub-ului, chiar și de spații, îl strică. - Găzduirea proprie a stub-ului ca fișier extern pe propriul tău domeniu, acoperit de
'self'. Necesită grijă pentru ca fișierul să se încarce suficient de devreme.
Evită 'unsafe-inline' ca scurtătură. Permite toate scripturile inline, ceea ce elimină o bună parte din protecția oferită de CSP.
Nonce-uri și scripturile injectate de CMP
Un CMP care blochează scripturile până la consimțământ funcționează adesea ținându-le în așteptare și injectându-le mai târziu. Sub o CSP bazată pe nonce, și acele scripturi injectate trebuie permise. Există două abordări frecvente:
- Propagarea nonce-ului. CMP-ul citește nonce-ul din propria etichetă de script și îl adaugă fiecărui script pe care îl injectează. Verifică dacă CMP-ul tău acceptă acest lucru.
'strict-dynamic'. Acest cuvânt-cheie le spune browserelor compatibile să aibă încredere în scripturile încărcate de un script deja de încredere. Simplifică viața cu managerii de taguri și cu CMP-urile care injectează scripturi, dar înseamnă și că orice script în care ai încredere poate încărca altele, așa că acordă încrederea cu grijă.
Managerii de taguri ridică aceeași întrebare. Dacă încarci tagurile de reclame și de analitică printr-un manager de taguri, urmează documentația acestuia despre nonce-uri și asigură-te că CMP-ul și managerul de taguri folosesc o abordare consecventă.
Tagurile de reclame fac CSP mai dificilă
Publicitatea programatică încarcă scripturi și cadre din multe domenii, iar lista se schimbă pe măsură ce se schimbă partenerii de cerere. Editorii fac de obicei una dintre cele două alegeri:
- O CSP strictă pe paginile fără reclame programatice și o politică mai largă acolo unde rulează reclamele.
- O politică axată pe directive care rămân gestionabile, precum
frame-ancestors,object-src 'none'șibase-uri, în timp ce sursele de scripturi rămân mai largi.
Oricum, CMP-ul ar trebui să fie pe lista explicită de permisiuni, nu acoperit doar de un wildcard, astfel încât o modificare a CSP să nu dezactiveze niciodată pe tăcute bannerul.
Lansează cu modul doar-raportare
Folosește mai întâi antetul Content-Security-Policy-Report-Only. Browserul raportează încălcările fără să blocheze nimic, astfel încât poți vedea ce ar strica o politică nouă.
- Implementează politica în modul doar-raportare, cu un punct final de raportare.
- Încarcă pagini în profiluri de browser curate și parcurge întregul flux de consimțământ: prima vizită, acceptă tot, refuză tot, alegere personalizată, retragere.
- Examinează rapoartele de încălcări și consola browserului pentru resurse CMP blocate.
- Ajustează politica, apoi treci la aplicarea efectivă.
- Păstrează raportarea activă și după aplicare, pentru a prinde regresiile.
Simptomele unui conflict CSP
- Bannerul nu apare niciodată, iar consola arată o încălcare CSP pentru scriptul CMP.
- Bannerul apare, dar fără stil, pentru că
style-srcîi blochează CSS-ul. - Alegerile nu sunt salvate, pentru că
connect-srcblochează apelul de înregistrare a consimțământului. - Reclamele sau analitica nu se încarcă niciodată după consimțământ, pentru că scripturilor injectate le lipsește un nonce.
__tcfapieste nedefinit, pentru că stub-ul inline a fost blocat.
Concluzii-cheie
- Verifică
script-src,connect-src,style-src,img-srcșiframe-srcpentru CMP-ul tău. - Permite stub-ul inline cu un nonce sau un hash, nu cu
'unsafe-inline'. - Asigură-te că scripturile injectate după consimțământ primesc un nonce sau sunt acoperite de
'strict-dynamic'. - Testează fiecare traseu de consimțământ în modul doar-raportare înainte de aplicare.
- Păstrează CMP-ul explicit pe lista de permisiuni, astfel încât modificările CSP să nu-l poată dezactiva.