Content Security Policy және CMP: CSP мен келісімді бірге жұмыс істету
Келісуі тиіс екі қауіпсіздік қабаты
Content Security Policy (CSP) браузерге бет скрипттерді, стильдерді, суреттерді, фреймдерді және желі сұрауларын қай көздерден жүктей алатынын айтады. Келісімді басқару платформасы керісінше іс атқарады: пайдаланушы таңдауына қарай осы скрипттердің қайсысының жұмыс істеуіне рұқсат етілетінін шешеді. Екеуі бөлек конфигурацияланғанда, олар қақтығысады. CSP бұғаттағандықтан CMP жүктелмейді немесе CSP CMP мен жарнама тегтерін сыйғызу үшін соншалықты босатылады, ол енді ештеңені қорғамайды.
Бұл нұсқаулық CMP әдетте қандай CSP директиваларын қажет ететінін, nonce-тардың скрипт инъекциясымен қалай әрекеттесетінін және баннерді бұзбай өзгерістерді қалай енгізуді түсіндіреді.
CMP CSP-ден әдетте нені қажет етеді
Нақты талаптар жеткізушіге байланысты, сондықтан әрқашан CMP-іңіздің өз құжаттамасынан бастаңыз. Жалпы алғанда, мына директиваларды тексеріңіз:
script-src— CMP скрипті жүктелетін домен және ол жүктейтін қосымша скрипт файлдары.connect-src— CMPfetchнемесе XHR арқылы шақыратын түйіндер, мысалы, конфигурация, жеткізушілер тізімі, геолокация және келісім журналы түйіндері.style-src— стильдер домені және, егер CMP<style>элементін енгізсе немесе стиль атрибуттарын орнатса, мүмкін инлайн стильдер.img-src— логотиптер, белгішелер және CMP қолданатын бақылаусыз пикселдер.font-src— егер баннер өз қаріптерін жүктесе.frame-src— егер CMP iframe-дерді қолданса, мысалы, домендер арасында келісімді бөлісу үшін.
TCF сайттарында CMP бетте __tcfapiLocator атты locator фреймін де жасайтынын есте ұстаңыз. Бұл фрейм қашықтағы көзсіз жасалады, сондықтан әдетте frame-src жазбасын қажет етпейді, бірақ тестілеу кезінде растауға тұрарлық.
Инлайн stub мәселесі
Көптеген CMP-лер басқа скрипттер негізгі CMP жүктелмес бұрын шақыруларды кезекке қоя алуы үшін бет тақырыбына шағын инлайн скрипт — stub — орналастыруды сұрайды. Қатаң CSP сіз нақты рұқсат бермейінше инлайн скрипттерді бұғаттайды. Сізде үш нұсқа бар:
- Nonce. Әр жауап үшін кездейсоқ мән жасаңыз, оны CSP тақырыбына
'nonce-...'ретінде және stub-тың<script>тегіне қосыңыз. Динамикалық беттер үшін ең икемді нұсқа. - Хэш. Stub-тың нақты мазмұнының SHA-256 хэшін
script-srcмәніне қосыңыз. Статикалық сайттар үшін жақсы жұмыс істейді, бірақ stub-тағы кез келген өзгеріс, тіпті бос орын да, оны бұзады. - Stub-ты өз доменіңізде сыртқы файл ретінде орналастыру және
'self'арқылы қамту. Оның жеткілікті ерте жүктелуін қамтамасыз ету мұқияттылықты қажет етеді.
Жолды қысқарту ретінде 'unsafe-inline' мәнінен аулақ болыңыз. Ол әр инлайн скриптке рұқсат береді және бұл CSP беретін қорғаныстың көп бөлігін жояды.
Nonce-тар және CMP енгізетін скрипттер
Келісімге дейін скрипттерді бұғаттайтын CMP көбіне оларды ұстап тұрып, кейін енгізу арқылы жұмыс істейді. Nonce негізіндегі CSP кезінде бұл енгізілген скрипттерге де рұқсат берілуі керек. Екі кең таралған тәсіл бар:
- Nonce тарату. CMP nonce мәнін өз скрипт тегінен оқиды және енгізетін әр скриптке қосады. CMP-іңіздің мұны қолдайтынын тексеріңіз.
'strict-dynamic'. Бұл кілт сөз қолдайтын браузерлерге сенімді скрипт жүктеген скрипттерге сенуді айтады. Ол скрипттерді енгізетін тег менеджерлері мен CMP-лермен жұмысты жеңілдетеді, бірақ сенімді кез келген скрипт басқаларын жүктей алатынын да білдіреді, сондықтан абайлап сеніңіз.
Тег менеджерлері де дәл осы сұрақты қояды. Егер жарнама және аналитика тегтерін тег менеджері арқылы жүктесеңіз, оның nonce-тар жөніндегі құжаттамасын орындаңыз және CMP мен тег менеджері бірыңғай тәсілді қолданатынына көз жеткізіңіз.
Жарнама тегтері CSP-ді қиындатады
Бағдарламалық жарнама көптеген домендерден скрипттер мен фреймдерді жүктейді және тізім сұраныс серіктестері өзгерген сайын өзгереді. Баспагерлер әдетте екі таңдаудың бірін жасайды:
- Бағдарламалық жарнамасы жоқ беттерде қатаң CSP, жарнама жұмыс істейтін жерлерде кеңірек саясат.
- Басқаруға болатын директиваларға, мысалы,
frame-ancestors,object-src 'none'жәнеbase-uriдирективаларына бағытталған, скрипт көздері кеңірек қалатын саясат.
Қалай болғанда да, CSP өзгерісі баннерді үнсіз өшіріп тастамауы үшін CMP тек үлгі таңбамен емес, нақты рұқсат тізімінде болуы керек.
Report-only режимінде енгізіңіз
Алдымен Content-Security-Policy-Report-Only тақырыбын қолданыңыз. Браузер ештеңені бұғаттамай бұзушылықтар туралы хабарлайды, сонда жаңа саясат нені бұзатынын көре аласыз.
- Саясатты есеп беру түйінімен report-only режимінде орналастырыңыз.
- Беттерді таза браузер профильдерінде жүктеңіз және келісімнің бүкіл ағынынан өтіңіз: бірінші келу, барлығын қабылдау, барлығынан бас тарту, арнайы таңдау, қайтарып алу.
- Бұғатталған CMP ресурстары үшін бұзушылық есептерін және браузер консолін қарап шығыңыз.
- Саясатты түзетіңіз, содан кейін мәжбүрлі қолдануға көшіңіз.
- Регрессияларды ұстау үшін мәжбүрлі қолданудан кейін де есеп беруді қосулы ұстаңыз.
CSP қақтығысының белгілері
- Баннер ешқашан пайда болмайды және консоль CMP скрипті үшін CSP бұзушылығын көрсетеді.
- Баннер пайда болады, бірақ стильсіз, өйткені
style-srcоның CSS-ін бұғаттайды. - Таңдаулар сақталмайды, өйткені
connect-srcкелісім журналы шақыруын бұғаттайды. - Келісімнен кейін жарнама немесе аналитика ешқашан жүктелмейді, өйткені енгізілген скрипттерде nonce жоқ.
__tcfapiанықталмаған, өйткені инлайн stub бұғатталған.
Негізгі қорытындылар
- CMP-іңіз үшін
script-src,connect-src,style-src,img-srcжәнеframe-srcдирективаларын тексеріңіз. - Инлайн stub-қа
'unsafe-inline'арқылы емес, nonce немесе хэш арқылы рұқсат беріңіз. - Келісімнен кейін енгізілетін скрипттер nonce алатынына немесе
'strict-dynamic'арқылы қамтылатынына көз жеткізіңіз. - Мәжбүрлі қолданар алдында әр келісім жолын report-only режимінде тестілеңіз.
- CSP өзгерістері оны өшіре алмауы үшін CMP-ді нақты рұқсат тізімінде ұстаңыз.