سیاست امنیت محتوا و CMP شما: همکاری CSP و رضایت
دو لایه امنیتی که باید با هم سازگار باشند
سیاست امنیت محتوا (CSP) به مرورگر میگوید یک صفحه از کدام منابع میتواند اسکریپت، سبک، تصویر، فریم و درخواست شبکه بارگذاری کند. یک پلتفرم مدیریت رضایت کار مخالف را انجام میدهد: بر اساس انتخاب کاربر تصمیم میگیرد کدام یک از آن اسکریپتها اجازه اجرا دارند. وقتی این دو جداگانه پیکربندی شوند با هم برخورد میکنند. یا CMP بارگذاری نمیشود چون CSP آن را مسدود میکند، یا CSP برای جا دادن CMP و تگهای تبلیغاتی آنقدر شل میشود که دیگر از چیزی محافظت نمیکند.
این راهنما توضیح میدهد CMP معمولاً به کدام دستورهای CSP نیاز دارد، 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. به ازای هر پاسخ یک مقدار تصادفی تولید کنید و آن را بهصورت
'nonce-...'به سرآیند CSP و به تگ<script>استاب اضافه کنید. این انعطافپذیرترین گزینه برای صفحات پویاست. - هش. هش SHA-256 محتوای دقیق استاب را به
script-srcاضافه کنید. این برای سایتهای ایستا خوب کار میکند، اما هر تغییری در استاب، حتی یک فاصله، آن را میشکند. - میزبانی خودتان برای استاب بهصورت یک فایل بیرونی روی دامنه خودتان که با
'self'پوشش داده میشود. این کار دقت میخواهد تا بهاندازه کافی زود بارگذاری شود.
از 'unsafe-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 باید در فهرست مجاز صریح باشد، نه فقط با یک wildcard پوشش داده شود، تا تغییر CSP هرگز بنر را بیصدا از کار نیندازد.
اجرا با حالت Report-Only
ابتدا از سرآیند Content-Security-Policy-Report-Only استفاده کنید. مرورگر تخلفات را بدون مسدود کردن چیزی گزارش میکند تا ببینید سیاست جدید چه چیزی را خراب میکند.
- سیاست را در حالت report-only با یک نقطه پایانی گزارشدهی مستقر کنید.
- صفحات را در پروفایلهای تمیز مرورگر بارگذاری کنید و کل جریان رضایت را طی کنید: بازدید اول، پذیرش همه، رد همه، انتخاب سفارشی، پسگرفتن رضایت.
- گزارشهای تخلف و کنسول مرورگر را برای منابع مسدودشده CMP مرور کنید.
- سیاست را اصلاح کنید، سپس به حالت اجرایی بروید.
- گزارشدهی را پس از اجرایی شدن فعال نگه دارید تا پسرفتها شناسایی شوند.
نشانههای تعارض CSP
- بنر هرگز ظاهر نمیشود و کنسول تخلف CSP برای اسکریپت CMP نشان میدهد.
- بنر ظاهر میشود اما بدون سبک است، چون
style-srcسیاساس آن را مسدود میکند. - انتخابها ذخیره نمیشوند، چون
connect-srcفراخوانی ثبت رضایت را مسدود میکند. - تبلیغات یا تحلیلها پس از رضایت هرگز بارگذاری نمیشوند، چون اسکریپتهای تزریقشده nonce ندارند.
__tcfapiتعریفنشده است، چون استاب درونخطی مسدود شده بود.
نکات کلیدی
- برای CMP خود
script-src،connect-src،style-src،img-srcوframe-srcرا بررسی کنید. - استاب درونخطی را با nonce یا هش مجاز کنید، نه با
'unsafe-inline'. - مطمئن شوید اسکریپتهای تزریقشده پس از رضایت nonce میگیرند یا با
'strict-dynamic'پوشش داده میشوند. - هر مسیر رضایت را پیش از اجرایی کردن در حالت report-only آزمایش کنید.
- CMP را صریحاً در فهرست مجاز نگه دارید تا تغییرات CSP نتوانند آن را غیرفعال کنند.