Content Security Policy i vaš CMP: kako da CSP i privola rade zajedno
Dva sigurnosna sloja koja se moraju slagati
Content Security Policy (CSP) govori pregledniku iz kojih izvora stranica smije učitavati skripte, stilove, slike, okvire i mrežne zahtjeve. Platforma za upravljanje privolom radi suprotan posao: odlučuje koje od tih skripti smiju raditi na temelju odabira korisnika. Kad se to dvoje konfigurira odvojeno, sudaraju se. CMP se ne učita jer ga CSP blokira, ili se CSP toliko opusti da bi prihvatio CMP i oglasne tagove da više ništa ne štiti.
Ovaj vodič objašnjava koje CSP direktive CMP obično treba, kako nonceovi djeluju s umetanjem skripti i kako uvesti promjene a da se banner ne pokvari.
Što CMP obično traži od CSP-a
Točni zahtjevi ovise o dobavljaču, pa uvijek krenite od dokumentacije svog CMP-a. Općenito, provjerite ove direktive:
script-src— domena s koje se učitava CMP skripta, plus sve dodatne skriptne datoteke koje učitava.connect-src— krajnje točke koje CMP poziva pomoćufetchili XHR-a, poput konfiguracije, popisa dobavljača, geolokacije i bilježenja privole.style-src— domena stilskog lista, a možda i inline stilovi ako CMP umeće element<style>ili postavlja atribute stila.img-src— logotipi, ikone i svi pikseli bez praćenja koje CMP koristi.font-src— ako banner učitava vlastite fontove.frame-src— ako CMP koristi iframeove, na primjer za dijeljenje privole među domenama.
Na TCF web-mjestima imajte na umu da CMP na stranici stvara i okvir lokator imena __tcfapiLocator. Taj se okvir stvara bez udaljenog izvora pa obično ne treba unos u frame-src, ali vrijedi to potvrditi u testiranju.
Problem inline stuba
Većina CMP-ova traži da u head stranice postavite malu inline skriptu — stub — kako bi druge skripte mogle stavljati pozive u red prije nego što se učita glavni CMP. Stroga CSP blokira inline skripte osim ako ih izričito ne dopustite. Imate tri mogućnosti:
- Nonce. Generirajte slučajnu vrijednost po odgovoru, dodajte je u CSP zaglavlje kao
'nonce-...'i u<script>tag stuba. To je najfleksibilnija opcija za dinamičke stranice. - Hash. Dodajte SHA-256 hash točnog sadržaja stuba u
script-src. To dobro funkcionira za statična web-mjesta, ali svaka promjena stuba, čak i razmaka, prekida ga. - Samostalno hostiranje stuba kao vanjske datoteke na vašoj domeni, pokrivene s
'self'. To zahtijeva pažnju da se učitava dovoljno rano.
Izbjegavajte 'unsafe-inline' kao prečac. On dopušta svaku inline skriptu, čime se uklanja velik dio zaštite koju CSP pruža.
Nonceovi i skripte koje CMP umeće
CMP koji blokira skripte do davanja privole često radi tako da ih zadržava i kasnije umeće. Pod CSP-om temeljenim na nonceu i te umetnute skripte moraju biti dopuštene. Postoje dva uobičajena pristupa:
- Propagacija noncea. CMP čita nonce iz svog skriptnog taga i dodaje ga svakoj skripti koju umetne. Provjerite podržava li to vaš CMP.
'strict-dynamic'. Ta ključna riječ govori preglednicima koji je podržavaju da vjeruju skriptama koje učita već pouzdana skripta. Olakšava život s upraviteljima tagova i CMP-ovima koji umeću skripte, ali znači i da svaka skripta kojoj vjerujete može učitati druge, stoga vjerujte pažljivo.
Upravitelji tagova postavljaju isto pitanje. Ako oglasne i analitičke tagove učitavate preko upravitelja tagova, slijedite njegovu dokumentaciju o nonceovima i pobrinite se da CMP i upravitelj tagova koriste dosljedan pristup.
Oglasni tagovi otežavaju CSP
Programatsko oglašavanje učitava skripte i okvire s mnogih domena, a popis se mijenja kako se mijenjaju partneri za potražnju. Izdavači obično biraju jedno od dvoje:
- Strogu CSP na stranicama bez programatskih oglasa i širu politiku tamo gdje se oglasi prikazuju.
- Politiku usmjerenu na direktive kojima se može upravljati, poput
frame-ancestors,object-src 'none'ibase-uri, dok izvori skripti ostaju širi.
U oba slučaja CMP treba biti na izričitom popisu dopuštenih, a ne pokriven samo zamjenskim znakom, kako promjena CSP-a nikada nečujno ne bi onemogućila banner.
Uvodite s report-only načinom
Prvo koristite zaglavlje Content-Security-Policy-Report-Only. Preglednik prijavljuje prekršaje a ništa ne blokira, pa možete vidjeti što bi nova politika pokvarila.
- Postavite politiku u report-only načinu s krajnjom točkom za izvješćivanje.
- Učitajte stranice u čistim profilima preglednika i prođite cijeli tijek privole: prvi posjet, prihvati sve, odbij sve, prilagođen odabir, povlačenje.
- Pregledajte izvješća o prekršajima i konzolu preglednika zbog blokiranih CMP resursa.
- Prilagodite politiku, pa prijeđite na provedbu.
- Zadržite izvješćivanje uključeno i nakon provedbe kako biste uhvatili regresije.
Simptomi sukoba s CSP-om
- Banner se nikada ne pojavljuje, a konzola pokazuje CSP prekršaj za CMP skriptu.
- Banner se pojavljuje, ali bez stilova, jer
style-srcblokira njegov CSS. - Odabiri se ne spremaju, jer
connect-srcblokira poziv za bilježenje privole. - Oglasi ili analitika nikada se ne učitaju nakon privole, jer umetnute skripte nemaju nonce.
__tcfapije nedefiniran, jer je inline stub bio blokiran.
Ključni zaključci
- Provjerite
script-src,connect-src,style-src,img-srciframe-srcza svoj CMP. - Dopustite inline stub pomoću noncea ili hasha, a ne
'unsafe-inline'. - Pobrinite se da skripte umetnute nakon privole dobiju nonce ili budu pokrivene s
'strict-dynamic'. - Testirajte svaki put privole u report-only načinu prije provedbe.
- Držite CMP izričito na popisu dopuštenih da ga promjene CSP-a ne mogu onemogućiti.