سیاست محدودکنندهٔ محتوا یا CSP به مرورگر می‌گوید محتوا و اسکریپت را از چه منابعی بپذیرد. امشب برای سایت ثابت آن را مرحله‌ای تنظیم می‌کنیم تا خرابی برنامه پشت یک چک‌لیست پنهان نشود.

این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نام‌ها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.

محیط: سایت ثابت www؛ این policy را عیناً روی WordPress نصب نکن.

ابتدا رفتار را ببین#

در میزبان HTTPS، مرحلهٔ مشاهده را اضافه کن:

Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'"

Report-Only نقض policy را گزارش می‌کند ولی محتوا را با این هدر مسدود نمی‌کند. بدون endpoint گزارش، DevTools مرورگر محل دیدن رخدادهاست. ارسال گزارش به سرور به endpoint، حفاظت داده و سیاست نگه‌داری جدا نیاز دارد.

داخل فایل HTML آزمایشگاهی یک <script> درون‌خطی برای نوشتن پیام در console اضافه کن. با policy بالا باید هشدار نقض ببینی، ولی اسکریپت هنوز اجرا شود. سپس اسکریپت را به فایل محلی /assets/lab.js منتقل و با src ارجاع بده؛ دیگر نباید همان هشدار را داشته باشد.

پس از بررسی همهٔ منابع سایت، هدر Report-Only را حذف و نسخهٔ اجرایی را جایگزین کن:

Header always set Content-Security-Policy "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'"

اکنون اسکریپت درون‌خطی باید مسدود و فایل هم‌مبدأ اجرا شود. frame-ancestors محدودیت قرار گرفتن صفحه در frame دیگر است؛ اگر embedding مجاز داری، منابع مجاز را مشخص کن.

nonce را چه کسی می‌سازد؟#

برنامهٔ پویا می‌تواند برای هر پاسخ nonce تصادفی بسازد و آن را هم در هدر و هم در تگ مجاز قرار دهد. nonce ثابت در config Apache این خاصیت را ندارد. اضافه کردن 'unsafe-inline' فقط برای ساکت کردن هشدار، اثر حفاظتی بخش script را ضعیف می‌کند.

بازگشت و تمرین: قبل از اجرای policy روی WordPress، همهٔ مسیرهای ورود، ویرایشگر، قالب و افزونه را در حالت مشاهده بررسی کن. برای بازگشت، هدر اجرایی را بردار و به Report-Only برگرد. آزمون curl وجود هدر را ثابت می‌کند؛ رفتار CSP به آزمون مرورگر نیاز دارد.

منبع: راهنمای CSP در MDN .