Content Security Policy a váš CMP: jak zajistit, aby CSP a souhlas fungovaly společně
Dvě bezpečnostní vrstvy, které se musí shodnout
Content Security Policy (CSP) říká prohlížeči, z jakých zdrojů smí stránka načítat skripty, styly, obrázky, rámce a síťové požadavky. Platforma pro správu souhlasu dělá opačnou práci: rozhoduje, které z těchto skriptů smějí běžet na základě volby uživatele. Když se obojí konfiguruje zvlášť, srazí se. CMP se nenačte, protože ho CSP blokuje, nebo se CSP uvolní tak, aby vyhovělo CMP a reklamním tagům, že už nic nechrání.
Tento průvodce vysvětluje, které direktivy CSP CMP obvykle potřebuje, jak nonce interagují s vkládáním skriptů a jak nasadit změny, aniž by se rozbil banner.
Co CMP obvykle od CSP potřebuje
Přesné požadavky závisejí na dodavateli, proto vždy vycházejte z dokumentace svého CMP. Obecně zkontrolujte tyto direktivy:
script-src— doména, ze které se načítá skript CMP, plus všechny další soubory skriptů, které načítá.connect-src— koncové body, které CMP volá pomocífetchnebo XHR, například konfigurace, seznam dodavatelů, geolokace a zaznamenávání souhlasu.style-src— doména šablony stylů a případně inline styly, pokud CMP vkládá prvek<style>nebo nastavuje atributy stylu.img-src— loga, ikony a případné pixely bez sledování, které CMP používá.font-src— pokud banner načítá vlastní fonty.frame-src— pokud CMP používá iframy, například pro sdílení souhlasu napříč doménami.
Na webech s TCF pamatujte, že CMP na stránce vytváří také rámec lokátor s názvem __tcfapiLocator. Tento rámec se vytváří bez vzdáleného zdroje, takže obvykle nepotřebuje položku v frame-src, ale stojí za to to při testování potvrdit.
Problém s inline stubem
Většina CMP po vás chce, abyste do hlavičky stránky vložili malý inline skript — stub — aby ostatní skripty mohly řadit volání do fronty dříve, než se načte hlavní CMP. Přísná CSP inline skripty blokuje, pokud je výslovně nepovolíte. Máte tři možnosti:
- Nonce. Vygenerujte náhodnou hodnotu pro každou odpověď, přidejte ji do hlavičky CSP jako
'nonce-...'a do tagu<script>stubu. Je to nejflexibilnější možnost pro dynamické stránky. - Hash. Přidejte hash SHA-256 přesného obsahu stubu do
script-src. Pro statické weby to funguje dobře, ale jakákoli změna stubu, i mezery, ho rozbije. - Vlastní hostování stubu jako externího souboru na vaší doméně, pokryté direktivou
'self'. To vyžaduje pozornost, aby se načítal dostatečně brzy.
Nepoužívejte 'unsafe-inline' jako zkratku. Povoluje každý inline skript, čímž odstraňuje velkou část ochrany, kterou CSP poskytuje.
Nonce a skripty, které CMP vkládá
CMP, který blokuje skripty do udělení souhlasu, často funguje tak, že je zadržuje a později vkládá. U CSP založené na nonce musí být povoleny i tyto vložené skripty. Existují dva běžné přístupy:
- Šíření nonce. CMP přečte nonce z vlastního tagu skriptu a přidá ho ke každému skriptu, který vloží. Ověřte, zda to váš CMP podporuje.
'strict-dynamic'. Toto klíčové slovo říká podporujícím prohlížečům, aby důvěřovaly skriptům načteným již důvěryhodným skriptem. Zjednodušuje život se správci tagů a CMP, které vkládají skripty, ale také znamená, že jakýkoli skript, kterému důvěřujete, může načíst další, proto důvěřujte opatrně.
Správci tagů otevírají stejnou otázku. Pokud reklamní a analytické tagy načítáte přes správce tagů, řiďte se jeho dokumentací k nonce a zajistěte, aby CMP a správce tagů používaly konzistentní přístup.
Reklamní tagy CSP ztěžují
Programatická reklama načítá skripty a rámce z mnoha domén a seznam se mění, jak se mění poptávkoví partneři. Vydavatelé obvykle volí jedno ze dvou:
- Přísnou CSP na stránkách bez programatických reklam a širší politiku tam, kde reklamy běží.
- Politiku zaměřenou na direktivy, které zůstávají spravovatelné, například
frame-ancestors,object-src 'none'abase-uri, zatímco zdroje skriptů zůstávají širší.
V obou případech by měl být CMP na explicitním seznamu povolených, ne pokrytý jen zástupným znakem, aby změna CSP nikdy tiše nevypnula banner.
Nasazujte s režimem report-only
Nejprve použijte hlavičku Content-Security-Policy-Report-Only. Prohlížeč hlásí porušení, aniž by cokoli blokoval, takže uvidíte, co by nová politika rozbila.
- Nasaďte politiku v režimu report-only s koncovým bodem pro reportování.
- Načtěte stránky v čistých profilech prohlížeče a projděte celý tok souhlasu: první návštěva, přijmout vše, odmítnout vše, vlastní volba, odvolání.
- Zkontrolujte zprávy o porušení a konzoli prohlížeče kvůli blokovaným zdrojům CMP.
- Upravte politiku a poté přepněte na vynucování.
- Reportování nechte zapnuté i po vynucení, abyste zachytili regrese.
Příznaky konfliktu s CSP
- Banner se nikdy nezobrazí a konzole ukazuje porušení CSP pro skript CMP.
- Banner se zobrazí, ale bez stylů, protože
style-srcblokuje jeho CSS. - Volby se neukládají, protože
connect-srcblokuje volání zaznamenávající souhlas. - Reklamy nebo analytika se po souhlasu nikdy nenačtou, protože vložené skripty nemají nonce.
__tcfapinení definováno, protože inline stub byl zablokován.
Hlavní poznatky
- Pro svůj CMP zkontrolujte
script-src,connect-src,style-src,img-srcaframe-src. - Inline stub povolte pomocí nonce nebo hashe, ne pomocí
'unsafe-inline'. - Zajistěte, aby skripty vložené po souhlasu dostaly nonce nebo byly pokryty
'strict-dynamic'. - Před vynucováním otestujte v režimu report-only každou cestu souhlasu.
- CMP mějte explicitně na seznamu povolených, aby ho změny CSP nemohly vypnout.