Content Security Policy ir jūsų CMP: kaip suderinti CSP ir sutikimą
Du saugumo sluoksniai, kurie turi sutapti
Content Security Policy (CSP) nurodo naršyklei, iš kokių šaltinių puslapis gali įkelti skriptus, stilius, vaizdus, rėmelius ir tinklo užklausas. Sutikimų valdymo platforma atlieka priešingą darbą: pagal vartotojo pasirinkimą sprendžia, kuriems iš tų skriptų leidžiama veikti. Kai abi sukonfigūruojamos atskirai, jos susiduria. CMP neįsikelia, nes CSP jį blokuoja, arba CSP taip atlaisvinama CMP ir reklamos žymių labui, kad nebeapsaugo nieko.
Šiame vadove paaiškinama, kokių CSP direktyvų paprastai reikia CMP, kaip nonce sąveikauja su skriptų įterpimu ir kaip diegti pakeitimus nesugadinant reklamjuostės.
Ko CMP paprastai reikia iš CSP
Tikslūs reikalavimai priklauso nuo tiekėjo, todėl visada pradėkite nuo savo CMP dokumentacijos. Apskritai patikrinkite šias direktyvas:
script-src— domenas, iš kurio įkeliamas CMP skriptas, plius visi papildomi skriptų failai, kuriuos jis įkelia.connect-src— galiniai taškai, kuriuos CMP kviečia perfetchar XHR, pavyzdžiui, konfigūracija, tiekėjų sąrašas, geolokacija ir sutikimo registravimas.style-src— stilių lapų domenas ir galbūt vidiniai stiliai, jei CMP įterpia<style>elementą ar nustato style atributus.img-src— logotipai, piktogramos ir bet kokie CMP naudojami pikseliai be sekimo.font-src— jei reklamjuostė įkelia savo šriftus.frame-src— jei CMP naudoja iframe, pavyzdžiui, sutikimui dalytis tarp domenų.
TCF svetainėse prisiminkite, kad CMP puslapyje taip pat sukuria rėmelį-lokatorių, pavadintą __tcfapiLocator. Šis rėmelis kuriamas be nuotolinio šaltinio, todėl paprastai jam frame-src įrašo nereikia, bet verta tai patvirtinti testuojant.
Inline stubo problema
Dauguma CMP prašo puslapio antraštėje (head) patalpinti mažą inline skriptą — stubą, kad kiti skriptai galėtų eilėje laikyti iškvietimus prieš įsikeliant pagrindiniam CMP. Griežta CSP inline skriptus blokuoja, nebent jų aiškiai neleisite. Turite tris galimybes:
- Nonce. Sugeneruokite atsitiktinę reikšmę kiekvienam atsakui, pridėkite ją į CSP antraštę kaip
'nonce-...'ir prie stubo<script>žymės. Tai lanksčiausias variantas dinaminiams puslapiams. - Maiša (hash). Į
script-srcpridėkite tikslaus stubo turinio SHA-256 maišą. Statinėms svetainėms tai veikia gerai, bet bet koks stubo pakeitimas, net tarpas, jį sugadina. - Savo stubo talpinimas kaip išorinio failo savo domene, padengto
'self'. Reikia pasirūpinti, kad jis įsikeltų pakankamai anksti.
Venkite 'unsafe-inline' kaip sutrumpinimo. Jis leidžia kiekvieną inline skriptą, o tai pašalina didelę dalį CSP teikiamos apsaugos.
Nonce ir CMP įterpiami skriptai
CMP, blokuojantis skriptus iki sutikimo, dažnai veikia juos sulaikydamas ir įterpdamas vėliau. Esant nonce pagrįstai CSP, šiuos įterptus skriptus taip pat reikia leisti. Yra du dažni būdai:
- Nonce perdavimas. CMP nuskaito nonce iš savo skripto žymės ir prideda prie kiekvieno įterpiamo skripto. Patikrinkite, ar jūsų CMP tai palaiko.
'strict-dynamic'. Šis raktažodis nurodo jį palaikančioms naršyklėms pasitikėti skriptais, kuriuos įkėlė jau patikimas skriptas. Jis palengvina gyvenimą su žymų valdytuvais ir CMP, įterpiančiais skriptus, bet taip pat reiškia, kad bet kuris jūsų pasitikimas skriptas gali įkelti kitus, todėl pasitikėkite atsargiai.
Tą patį klausimą kelia ir žymių valdytuvai. Jei reklamos ir analitikos žymes įkeliate per žymių valdytuvą, laikykitės jo dokumentacijos apie nonce ir įsitikinkite, kad CMP ir žymių valdytuvas naudoja nuoseklų požiūrį.
Reklamos žymės apsunkina CSP
Programinė reklama įkelia skriptus ir rėmelius iš daugelio domenų, o sąrašas keičiasi keičiantis paklausos partneriams. Leidėjai paprastai renkasi vieną iš dviejų kelių:
- Griežtą CSP puslapiuose be programinės reklamos ir platesnę politiką ten, kur reklama veikia.
- Politiką, orientuotą į direktyvas, kurias lieka įmanoma valdyti, pavyzdžiui,
frame-ancestors,object-src 'none'irbase-uri, o skriptų šaltiniai lieka platesni.
Bet kuriuo atveju CMP turėtų būti aiškiame leidžiamųjų sąraše, o ne padengtas vien pakaitos simboliu, kad CSP pakeitimas niekada tyliai neišjungtų reklamjuostės.
Diegkite Report-Only režimu
Pirmiausia naudokite Content-Security-Policy-Report-Only antraštę. Naršyklė praneša apie pažeidimus nieko neblokuodama, todėl matote, ką nauja politika sugadintų.
- Įdiekite politiką report-only režimu su ataskaitų galiniu tašku.
- Įkelkite puslapius švariuose naršyklės profiliuose ir praeikite visą sutikimo eigą: pirmas apsilankymas, priimti viską, atmesti viską, pasirinktinis variantas, atšaukimas.
- Peržiūrėkite pažeidimų ataskaitas ir naršyklės konsolę ieškodami užblokuotų CMP išteklių.
- Pakoreguokite politiką, tada perjunkite į vykdymą.
- Po perjungimo palikite ataskaitas įjungtas, kad pastebėtumėte regresijas.
CSP konflikto simptomai
- Reklamjuostė niekada nepasirodo, o konsolė rodo CSP pažeidimą CMP skriptui.
- Reklamjuostė pasirodo, bet be stilių, nes
style-srcblokuoja jos CSS. - Pasirinkimai neišsaugomi, nes
connect-srcblokuoja sutikimo registravimo iškvietimą. - Reklama ar analitika po sutikimo niekada neįsikelia, nes įterptiems skriptams trūksta nonce.
__tcfapineapibrėžtas, nes inline stubas buvo užblokuotas.
Pagrindinės išvados
- Savo CMP patikrinkite
script-src,connect-src,style-src,img-srcirframe-src. - Inline stubą leiskite naudodami nonce ar maišą, o ne
'unsafe-inline'. - Įsitikinkite, kad po sutikimo įterpiami skriptai gauna nonce arba juos apima
'strict-dynamic'. - Prieš vykdymą išbandykite kiekvieną sutikimo kelią report-only režimu.
- Laikykite CMP aiškiame leidžiamųjų sąraše, kad CSP pakeitimai jo neišjungtų.