Content Security Policy in vaš CMP: kako naj CSP in privolitev delujeta skupaj
Dve varnostni plasti, ki se morata ujemati
Content Security Policy (CSP) brskalniku pove, iz katerih virov sme stran nalagati skripte, sloge, slike, okvirje in omrežne zahteve. Platforma za upravljanje privolitve opravlja nasprotno delo: na podlagi izbire uporabnika odloča, katere od teh skript se smejo izvajati. Kadar sta konfigurirani ločeno, trčita. CMP se ne naloži, ker ga CSP blokira, ali pa se CSP tako zrahlja zaradi CMP-ja in oglasnih oznak, da ne ščiti več ničesar.
Ta vodnik pojasnjuje, katere direktive CSP CMP običajno potrebuje, kako nonce vplivajo na vstavljanje skript in kako uvesti spremembe, ne da bi pokvarili pasico.
Kaj CMP običajno potrebuje od CSP
Natančne zahteve so odvisne od ponudnika, zato vedno izhajajte iz dokumentacije svojega CMP-ja. Na splošno preverite te direktive:
script-src— domena, iz katere se naloži skripta CMP, in vse dodatne skriptne datoteke, ki jih naloži.connect-src— končne točke, ki jih CMP kliče zfetchali XHR, kot so konfiguracija, seznam dobaviteljev, geolokacija in beleženje privolitve.style-src— domena slogovne datoteke in morda inline slogi, če CMP vstavi element<style>ali nastavi atribute sloga.img-src— logotipi, ikone in vse slikovne pike brez sledenja, ki jih CMP uporablja.font-src— če pasica nalaga lastne pisave.frame-src— če CMP uporablja iframe, na primer za deljenje privolitve med domenami.
Na straneh TCF ne pozabite, da CMP na strani ustvari tudi okvir lokator z imenom __tcfapiLocator. Ta okvir se ustvari brez oddaljenega vira, zato običajno ne potrebuje vnosa v frame-src, a to je vredno potrditi pri preizkušanju.
Težava z inline stubom
Večina CMP-jev zahteva, da v glavo strani postavite majhno inline skripto — stub — da lahko druge skripte postavijo klice v vrsto, preden se naloži glavni CMP. Stroga CSP blokira inline skripte, razen če jih izrecno dovolite. Imate tri možnosti:
- Nonce. Ustvarite naključno vrednost za vsak odgovor, jo dodajte v glavo CSP kot
'nonce-...'in v oznako<script>stuba. To je najbolj prilagodljiva možnost za dinamične strani. - Hash. Dodajte zgoščeno vrednost SHA-256 natančne vsebine stuba v
script-src. To dobro deluje za statična spletna mesta, vendar jo vsaka sprememba stuba, tudi presledka, pokvari. - Samostojno gostovanje stuba kot zunanje datoteke na vaši domeni, pokrite z
'self'. To zahteva pazljivost, da se nalaga dovolj zgodaj.
Izogibajte se 'unsafe-inline' kot bližnjici. Dovoljuje vsako inline skripto, s čimer odstrani velik del zaščite, ki jo nudi CSP.
Nonce in skripte, ki jih CMP vstavlja
CMP, ki blokira skripte do privolitve, pogosto deluje tako, da jih zadrži in pozneje vstavi. Pri CSP na osnovi noncea morajo biti dovoljene tudi te vstavljene skripte. Obstajata dva pogosta pristopa:
- Širjenje noncea. CMP prebere nonce iz svoje oznake skripte in ga doda vsaki skripti, ki jo vstavi. Preverite, ali vaš CMP to podpira.
'strict-dynamic'. Ta ključna beseda podprtim brskalnikom pove, naj zaupajo skriptam, ki jih naloži že zaupanja vredna skripta. Poenostavi življenje z upravitelji oznak in CMP-ji, ki vstavljajo skripte, a pomeni tudi, da lahko vsaka skripta, ki ji zaupate, naloži druge, zato zaupajte previdno.
Upravitelji oznak odpirajo isto vprašanje. Če oglasne in analitične oznake nalagate prek upravitelja oznak, sledite njegovi dokumentaciji o noncih in poskrbite, da CMP in upravitelj oznak uporabljata dosleden pristop.
Oglasne oznake otežijo CSP
Programatično oglaševanje nalaga skripte in okvirje iz številnih domen, seznam pa se spreminja z menjavo partnerjev na strani povpraševanja. Izdajatelji se običajno odločijo za eno od dveh možnosti:
- Stroga CSP na straneh brez programatičnih oglasov in širša politika tam, kjer se oglasi izvajajo.
- Politika, osredotočena na direktive, ki ostanejo obvladljive, kot so
frame-ancestors,object-src 'none'inbase-uri, medtem ko viri skript ostanejo širši.
V vsakem primeru naj bo CMP na izrecnem seznamu dovoljenih, ne le pokrit z nadomestnim znakom, da sprememba CSP nikoli tiho ne onemogoči pasice.
Uvajajte z načinom report-only
Najprej uporabite glavo Content-Security-Policy-Report-Only. Brskalnik prijavlja kršitve, ne da bi karkoli blokiral, zato lahko vidite, kaj bi nova politika pokvarila.
- Politiko postavite v načinu report-only s končno točko za poročanje.
- Naložite strani v čistih profilih brskalnika in prehodite celoten potek privolitve: prvi obisk, sprejmi vse, zavrni vse, izbira po meri, preklic.
- Preglejte poročila o kršitvah in konzolo brskalnika zaradi blokiranih virov CMP.
- Prilagodite politiko in nato preklopite na uveljavljanje.
- Poročanje pustite vklopljeno tudi po uveljavitvi, da ujamete regresije.
Simptomi konflikta s CSP
- Pasica se nikoli ne pojavi, konzola pa kaže kršitev CSP za skripto CMP.
- Pasica se pojavi, a brez slogov, ker
style-srcblokira njen CSS. - Izbire se ne shranijo, ker
connect-srcblokira klic za beleženje privolitve. - Oglasi ali analitika se po privolitvi nikoli ne naložijo, ker vstavljene skripte nimajo noncea.
__tcfapini definiran, ker je bil inline stub blokiran.
Ključne ugotovitve
- Za svoj CMP preverite
script-src,connect-src,style-src,img-srcinframe-src. - Inline stub dovolite z noncem ali hashem, ne z
'unsafe-inline'. - Poskrbite, da skripte, vstavljene po privolitvi, prejmejo nonce ali so pokrite z
'strict-dynamic'. - Pred uveljavitvijo v načinu report-only preizkusite vsako pot privolitve.
- CMP naj bo izrecno na seznamu dovoljenih, da ga spremembe CSP ne morejo onemogočiti.