Content Security Policy і ваш CMP: як прымусіць CSP і згоду працаваць разам
Два ўзроўні абароны, якія павінны ўзгадняцца
Content Security Policy (CSP) паведамляе браўзеру, з якіх крыніц старонцы дазволена загружаць скрыпты, стылі, выявы, фрэймы і сеткавыя запыты. Платформа кіравання згодай выконвае процілеглую задачу: яна вырашае, якія з гэтых скрыптоў можна запускаць, зыходзячы з выбару карыстальніка. Калі наладжваць іх паасобку, яны сутыкаюцца. CMP не загружаецца, бо CSP яго блакуе, або CSP аслабляюць так моцна дзеля CMP і рэкламных тэгаў, што яна ўжо нічога не абараняе.
У гэтым кіраўніцтве тлумачыцца, якія дырэктывы CSP звычайна патрэбны CMP, як nonce ўзаемадзейнічаюць з укараненнем скрыптоў і як уносіць змены, не ламаючы банер.
Што CMP звычайна патрэбна ад CSP
Дакладныя патрабаванні залежаць ад вендара, таму заўсёды пачынайце з уласнай дакументацыі вашага CMP. Увогуле праверце такія дырэктывы:
script-src— дамен, з якога загружаецца скрыпт CMP, плюс любыя дадатковыя файлы скрыптоў, якія ён падгружае.connect-src— канчатковыя кропкі, якія CMP выклікае празfetchабо XHR, напрыклад для канфігурацыі, спіса вендараў, геалакацыі і запісу згод.style-src— дамен табліцы стыляў і, магчыма, убудаваныя стылі, калі CMP укараняе элемент<style>або задае атрыбуты style.img-src— лагатыпы, значкі і любыя пікселі без адсочвання, якія выкарыстоўвае CMP.font-src— калі банер загружае ўласныя шрыфты.frame-src— калі CMP выкарыстоўвае iframe, напрыклад для абмену згодай паміж даменамі.
На сайтах з TCF памятайце, што CMP таксама стварае на старонцы фрэйм-лакатар з імем __tcfapiLocator. Гэты фрэйм ствараецца без аддаленай крыніцы, таму запісу ў frame-src яму звычайна не патрэбна, але гэта варта пацвердзіць падчас тэсціравання.
Праблема ўбудаванай заглушкі
Большасць CMP просяць разместіць у head старонкі невялікі ўбудаваны скрыпт — заглушку, — каб іншыя скрыпты маглі ставіць выклікі ў чаргу да загрузкі асноўнага CMP. Строгая CSP блакуе ўбудаваныя скрыпты, калі відавочна іх не дазволіць. Ёсць тры варыянты:
- Nonce. Генеруйце выпадковае значэнне для кожнага адказу, дадавайце яго ў загаловак CSP як
'nonce-...'і ў тэг<script>заглушкі. Гэта найбольш гібкі варыянт для дынамічных старонак. - Хэш. Дадайце SHA-256-хэш дакладнага змесціва заглушкі ў
script-src. Гэта добра працуе для статычных сайтаў, але любая змена заглушкі, нават прабелу, яго ламае. - Размяшчэнне заглушкі ў сябе як вонкавага файла на вашым дамене, які пакрываецца
'self'. Тут патрэбна асцярожнасць, каб яна па-ранейшаму загружалася дастаткова рана.
Пазбягайце 'unsafe-inline' як лёгкага шляху. Ён дазваляе любыя ўбудаваныя скрыпты, што здымае большую частку абароны, якую дае CSP.
Nonce і скрыпты, якія ўкараняе CMP
CMP, які блакуе скрыпты да атрымання згоды, часта працуе так: утрымлівае іх і ўкараняе пазней. Пры CSP на аснове nonce гэтыя ўкараняемыя скрыпты таксама павінны быць дазволеныя. Ёсць два распаўсюджаныя падыходы:
- Перадача nonce. CMP счытвае nonce са свайго тэга script і дадае яго да кожнага скрыпта, які ўкараняе. Праверце, ці падтрымлівае гэта ваш CMP.
'strict-dynamic'. Гэта ключавое слова паведамляе браўзерам, што яго падтрымліваюць, што скрыптам, загружаным ужо давераным скрыптам, можна давяраць. Яно спрашчае працу з менеджарамі тэгаў і CMP, што ўкараняюць скрыпты, але азначае і тое, што любы давераны вамі скрыпт можа загружаць іншыя, таму давярайце асцярожна.
Менеджары тэгаў узнімаюць тое самае пытанне. Калі вы загружаеце рэкламныя і аналітычныя тэгі праз менеджар тэгаў, прытрымлівайцеся яго дакументацыі па nonce і пераканайцеся, што CMP і менеджар тэгаў выкарыстоўваюць узгоднены падыход.
Рэкламныя тэгі ўскладняюць CSP
Праграматык-рэклама загружае скрыпты і фрэймы з многіх даменаў, а спіс змяняецца разам з партнёрамі па попыце. Выдаўцы звычайна абіраюць адно з двух:
- Строгая CSP на старонках без праграматык-рэкламы і больш шырокая палітыка там, дзе яна паказваецца.
- Палітыка, засяроджаная на дырэктывах, якімі застаецца пасільна кіраваць, такіх як
frame-ancestors,object-src 'none'іbase-uri, пры больш шырокіх крыніцах скрыптоў.
У любым выпадку CMP павінен быць у відавочным спісе дазволеных, а не пакрывацца толькі шаблонам-падстаноўкай, каб змена CSP ніколі не адключыла банер незаўважна.
Укараняйце праз рэжым Report-Only
Спачатку выкарыстайце загаловак Content-Security-Policy-Report-Only. Браўзер паведамляе пра парушэнні, нічога не блакуючы, таму вы бачыце, што зламала б новая палітыка.
- Разгарніце палітыку ў рэжыме report-only з канчатковай кропкай для справаздач.
- Загружайце старонкі ў чыстых профілях браўзера і прайдзіце ўвесь сцэнарый згоды: першы візіт, прыняць усё, адхіліць усё, уласны выбар, адклік.
- Вывучыце справаздачы пра парушэнні і кансоль браўзера на прадмет заблакаваных рэсурсаў CMP.
- Скарыгуйце палітыку, потым пераключыцеся на прымусовае прымяненне.
- Пакіньце справаздачы ўключанымі і пасля ўключэння прымянення, каб лавіць рэгрэсіі.
Сімптомы канфлікту з CSP
- Банер не з'яўляецца, а кансоль паказвае парушэнне CSP для скрыпта CMP.
- Банер з'яўляецца, але без стыляў, бо
style-srcблакуе яго CSS. - Выбар не захоўваецца, бо
connect-srcблакуе выклік запісу згоды. - Рэклама або аналітыка не загружаюцца пасля згоды, бо ва ўкараняемых скрыптоў няма nonce.
__tcfapiне вызначана, бо ўбудаваную заглушку заблакавалі.
Галоўныя высновы
- Праверце
script-src,connect-src,style-src,img-srcіframe-srcдля вашага CMP. - Дазваляйце ўбудаваную заглушку праз nonce або хэш, а не праз
'unsafe-inline'. - Пераканайцеся, што скрыпты, якія ўкараняюцца пасля згоды, атрымліваюць nonce або пакрываюцца
'strict-dynamic'. - Пратэстуйце кожны шлях згоды ў рэжыме report-only да ўключэння прымянення.
- Трымайце CMP у відавочным спісе дазволеных, каб змены CSP не маглі яго адключыць.