Content Security Policy və CMP-niz: CSP ilə Razılığı Birlikdə İşlətmək
Razılaşmalı olan iki təhlükəsizlik qatı
Content Security Policy (CSP) brauzerə səhifənin skriptləri, stilləri, şəkilləri, frame-ləri və şəbəkə sorğularını hansı mənbələrdən yükləyə biləcəyini bildirir. Razılığın idarə edilməsi platforması əks işi görür: istifadəçinin seçiminə əsasən həmin skriptlərdən hansının işləməsinə icazə verildiyini müəyyən edir. İkisi ayrı-ayrılıqda konfiqurasiya edildikdə toqquşurlar. CMP yüklənmir, çünki CSP onu bloklayır, ya da CSP CMP və reklam teqlərinə yer açmaq üçün o qədər boşaldılır ki, artıq heç nəyi qorumur.
Bu bələdçi CMP-nin adətən hansı CSP direktivlərinə ehtiyac duyduğunu, nonce-ların skript inyeksiyası ilə necə qarşılıqlı əlaqədə olduğunu və banneri pozmadan dəyişiklikləri necə tətbiq edəcəyinizi izah edir.
CMP adətən CSP-dən nə tələb edir
Dəqiq tələblər vendordan asılıdır, ona görə həmişə öz CMP-nizin sənədlərindən başlayın. Ümumiyyətlə, bu direktivləri yoxlayın:
script-src— CMP skriptinin yükləndiyi domen, üstəlik onun yüklədiyi hər hansı əlavə skript faylları.connect-src— CMP-ninfetchvə ya XHR ilə çağırdığı endpointlər, məsələn konfiqurasiya, vendor siyahısı, geolokasiya və razılıq loqlama.style-src— stil cədvəli domeni və CMP<style>elementi inyeksiya edirsə və ya style atributları təyin edirsə, ehtimal ki, inline stillər.img-src— loqolar, ikonlar və CMP-nin istifadə etdiyi izləməsiz piksellər.font-src— banner öz şriftlərini yükləyirsə.frame-src— CMP iframe-lərdən istifadə edirsə, məsələn domenlərarası razılıq paylaşımı üçün.
TCF saytlarında CMP-nin səhifədə __tcfapiLocator adlı locator frame yaratdığını da yadda saxlayın. Həmin frame uzaq mənbə olmadan yaradılır, ona görə də adətən frame-src girişi tələb etmir, lakin sınaqda təsdiqləməyə dəyər.
Inline stub problemi
Əksər CMP-lər səhifənin head-ində kiçik inline skript — stub — yerləşdirməyi xahiş edir ki, digər skriptlər əsas CMP yüklənməzdən əvvəl çağırışları növbəyə qoya bilsin. Sərt CSP açıq şəkildə icazə verməsəniz, inline skriptləri bloklayır. Üç variantınız var:
- Nonce. Hər cavab üçün təsadüfi dəyər yaradın, onu CSP başlığına
'nonce-...'kimi və stub-ın<script>teqinə əlavə edin. Bu, dinamik səhifələr üçün ən çevik variantdır. - Hash. Stub-ın dəqiq məzmununun SHA-256 hash-ini
script-src-ə əlavə edin. Bu, statik saytlar üçün yaxşı işləyir, lakin stub-da hər dəyişiklik, hətta boşluq da onu pozur. - Stub-ı özünüz host etmək öz domeninizdə
'self'ilə əhatə olunan xarici fayl kimi. Kifayət qədər erkən yüklənməsini təmin etmək üçün diqqət tələb edir.
Qısa yol kimi 'unsafe-inline'-dan çəkinin. O, hər inline skripti icazəli edir, bu da CSP-nin təmin etdiyi qorumanın böyük hissəsini aradan qaldırır.
Nonce-lar və CMP-nin inyeksiya etdiyi skriptlər
Razılığa qədər skriptləri bloklayan CMP çox vaxt onları saxlayıb sonra inyeksiya etməklə işləyir. Nonce əsaslı CSP altında bu inyeksiya edilmiş skriptlərə də icazə verilməlidir. İki ümumi yanaşma var:
- Nonce-un yayılması. CMP nonce-u öz skript teqindən oxuyur və inyeksiya etdiyi hər skripta əlavə edir. CMP-nizin bunu dəstəklədiyini yoxlayın.
'strict-dynamic'. Bu açar söz dəstəkləyən brauzerlərə artıq etibarlı skriptin yüklədiyi skriptlərə etibar etməyi bildirir. O, skript inyeksiya edən teq menecerləri və CMP-lərlə həyatı asanlaşdırır, lakin etibar etdiyiniz hər skriptin digərlərini yükləyə biləcəyi deməkdir, ona görə diqqətlə etibar edin.
Teq menecerləri eyni sualı qaldırır. Reklam və analitika teqlərini teq meneceri ilə yükləyirsinizsə, onun nonce sənədlərinə əməl edin və CMP ilə teq menecerinin ardıcıl yanaşma işlətdiyinə əmin olun.
Reklam teqləri CSP-ni çətinləşdirir
Proqramatik reklam çoxlu domenlərdən skript və frame yükləyir və tələb tərəfdaşları dəyişdikcə siyahı dəyişir. Naşirlər adətən iki seçimdən birini edir:
- Proqramatik reklamı olmayan səhifələrdə sərt CSP və reklamların işlədiyi yerdə daha geniş siyasət.
- İdarə oluna bilən qalan direktivlərə yönəlmiş siyasət, məsələn
frame-ancestors,object-src 'none'vəbase-uri, skript mənbələri isə daha geniş qalır.
Hər iki halda CMP yalnız wildcard ilə əhatə olunmaq əvəzinə açıq icazə siyahısında olmalıdır ki, CSP dəyişikliyi banneri səssizcə söndürməsin.
Report-Only rejimi ilə tətbiq edin
Əvvəlcə Content-Security-Policy-Report-Only başlığından istifadə edin. Brauzer heç nəyi bloklamadan pozuntuları bildirir, belə ki, yeni siyasətin nəyi poza biləcəyini görə bilərsiniz.
- Siyasəti report-only rejimində hesabat endpointi ilə yerləşdirin.
- Səhifələri təmiz brauzer profillərində yükləyin və tam razılıq axınından keçin: ilk ziyarət, hamısını qəbul et, hamısını rədd et, fərdi seçim, geri götürmə.
- Bloklanmış CMP resursları üçün pozuntu hesabatlarına və brauzer konsoluna baxın.
- Siyasəti tənzimləyin, sonra icra rejiminə keçin.
- Reqressiyaları tutmaq üçün icradan sonra da hesabatı aktiv saxlayın.
CSP konfliktinin əlamətləri
- Banner heç vaxt görünmür və konsol CMP skripti üçün CSP pozuntusu göstərir.
- Banner görünür, lakin stilsizdir, çünki
style-srconun CSS-ini bloklayır. - Seçimlər saxlanmır, çünki
connect-srcrazılıq loqlama çağırışını bloklayır. - Reklamlar və ya analitika razılıqdan sonra heç vaxt yüklənmir, çünki inyeksiya edilmiş skriptlərdə nonce yoxdur.
__tcfapitəyin olunmayıb, çünki inline stub bloklanıb.
Əsas nəticələr
- CMP-niz üçün
script-src,connect-src,style-src,img-srcvəframe-src-i yoxlayın. - Inline stub-a nonce və ya hash ilə icazə verin,
'unsafe-inline'ilə yox. - Razılıqdan sonra inyeksiya edilən skriptlərin nonce aldığına və ya
'strict-dynamic'ilə əhatə olunduğuna əmin olun. - İcradan əvvəl hər razılıq yolunu report-only rejimində sınayın.
- CSP dəyişikliklərinin onu söndürə bilməməsi üçün CMP-ni açıq icazə siyahısında saxlayın.