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— домен стилског листа, а можда и inline стилови ако CMP убацује елемент<style>или поставља атрибуте стила.img-src— логотипи, иконе и сви пиксели без праћења које CMP користи.font-src— ако банер учитава сопствене фонтове.frame-src— ако CMP користи iframe-ове, на пример за дељење сагласности између домена.
На TCF сајтовима, имајте на уму да CMP на страници креира и оквир локатор под именом __tcfapiLocator. Тај оквир се креира без удаљеног извора, па обично не захтева унос у frame-src, али вреди потврдити у тестирању.
Проблем inline stub-а
Већина CMP-ова тражи да у head странице поставите мали inline скрипт — stub — како би друге скрипте могле да стављају позиве у ред пре него што се учита главни CMP. Строга CSP блокира inline скрипте осим ако их изричито не дозволите. Имате три опције:
- Nonce. Генеришите насумичну вредност по одговору, додајте је у CSP заглавље као
'nonce-...'и у<script>таг stub-а. Ово је најфлексибилнија опција за динамичке странице. - Хеш. Додајте SHA-256 хеш тачног садржаја stub-а у
script-src. Ово добро функционише за статичке сајтове, али свака промена stub-а, чак и размака, прекида га. - Самостално хостовање stub-а као спољне датотеке на вашем домену, покривене са
'self'. Ово захтева пажњу да се учитава довољно рано.
Избегавајте 'unsafe-inline' као пречицу. Он дозвољава сваки inline скрипт, чиме се уклања велики део заштите коју CSP пружа.
Nonce-ови и скрипте које CMP убацује
CMP који блокира скрипте до давања сагласности често ради тако што их задржава и касније убацује. Под CSP-ом заснованим на nonce-у, и те убачене скрипте морају бити дозвољене. Постоје два уобичајена приступа:
- Пропагација nonce-а. CMP чита nonce из свог скрипт тага и додаје га свакој скрипти коју убаци. Проверите да ли ваш 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је недефинисан, јер је inline stub био блокиран.
Кључни закључци
- Проверите
script-src,connect-src,style-src,img-srcиframe-srcза свој CMP. - Дозволите inline stub помоћу nonce-а или хеша, а не
'unsafe-inline'. - Побрините се да скрипте убачене после сагласности добију nonce или буду покривене са
'strict-dynamic'. - Тестирајте сваки пут сагласности у report-only режиму пре спровођења.
- Држите CMP изричито на листи дозвољених да га промене CSP-а не могу онемогућити.