سیاست های امنیتی و CSP
1) چرا ما به سیاست های امنیتی نیاز داریم
ظاهر مدرن و API به بسیاری از منابع (CDN، تجزیه و تحلیل، PSP، 3DS، چت) بستگی دارد. بدون سیاست های سخت، خطرات XSS، clickjacking، نشت داده ها و ربودن جلسه افزایش می یابد. سیاست های امنیتی با انتقال مرورگر به مدل allow-list، آنچه را که به طور پیش فرض مجاز است محدود می کند.
2) ستون های اساسی
CSP (سیاست امنیت محتوا) یک «منو» متمرکز از منابع و رفتارهای مجاز JS/CSS/رسانه است.
انواع قابل اعتماد - حفاظت از نوع در برابر DOM-XSS.
SRI (یکپارچگی Subresource) - کنترل یکپارچگی اسکریپت ها/سبک ها.
COOP/COEP/CORP - جداسازی سفت و سخت از زمینه ها و منابع بین منابع.
Fetch Metadata («Sec-Fetch-») یک راه حل سرور برای فیلتر کردن درخواست های متقابل سایت است.
CORS - سیاست دسترسی API متقابل دامنه.
عناوین کلاسیک: HSTS، 'X-Frame-Options'/'frame-ancestors'، 'Referrer-Policy'، 'Permissions-Policy'، SameSite-cookies.
3) CSP: مبانی و اصول
3. 1 دستورالعمل ها (کلید)
'dafault-src' - پیش فرض برای دستورالعمل های دیگر.
'script-src' - منابع JS، nonce/hash، 'strict-dynamic'، 'report-sample'.
'style-src' - منابع CSS ؛ «unsafe-inline» را به حداقل برسانید.
'img-src', 'font-src', 'media-src', 'object-src' (معمولاً 'none').
'connect-src' - درخواستهای شبکه (XHR/fetch/WebSocket).
'frame-src'/'child-src' - فریم های شخص ثالث (PSP، 3DS).
«frame-ancestors» - که می تواند سایت ما را جاسازی کند (ضد کلیک کردن).
'base-uri' - جایگزینی <base> 'را ممنوع می کند.
«فرم عمل» - جایی که فرم ها مجاز به ارائه هستند.
«upgrade-insecure-requests», «block-all-mixed-content» - مبارزه با مخلوط HTTP/HTTPS.
'report-uri'/'report-to' - که در آن برای ارسال نقض.
3. 2 هش و Nonce
رویکرد Nonce: برای هر پاسخ HTTP یک "nonce" رمزنگاری تصادفی ایجاد کنید، "<script nonce ="... ">" را به اسکریپتهای درون خطی و "script-src" nonc- "... اضافه کنید
رویکرد هش: هش ثابت از محتوای درون خطی. مناسب برای HTML استاتیک، ناخوشایند برای دینامیک.
«strict-dynamic»: فقط اسکریپتهای قابل اعتماد که توسط یک اسکریپت «قابل اعتماد» بارگذاری شدهاند (با nonce/hash). حذف نیاز به لیست دامنه های هدف در طول بوت پویا، اما نیاز به مرورگرهای مدرن است.
3. 3 ممنوعیت «نا امن»
اجتناب از «ناامن درون خطی»، «ناامن eval». اگر فریمورک نیاز به eval دارد (برای مثال source-map در dev)، فقط شامل dev باشد.
برای سبک ها - در صورت امکان بدون inlines از «nonce» یا «hash» استفاده کنید.
3. 4 نمونه ای از CSP سخت (نقطه نبرد)
Content-Security-Policy:
default-src 'none';
base-uri 'self';
object-src 'none';
script-src 'self' 'nonce-{RANDOM}' 'strict-dynamic' https://www. googletagmanager. com;
style-src 'self' 'nonce-{RANDOM}';
img-src 'self' data: https://images. example-cdn. com;
font-src 'self' https://fonts. gstatic. com;
connect-src 'self' https://api. example. com wss://ws. example. com;
frame-src https://3ds. psp. com https://pay. psp. com;
frame-ancestors 'none';
form-action 'self' https://pay. psp. com;
upgrade-insecure-requests;
report-to csp-endpoint; report-sample
4) انواع قابل اعتماد (DOM-XSS)
این دستورالعمل را فعال کنید: "Content-Security-Policy: require-trusted-types-for" script "; «trusted-types app default».
یک خط مشی واحد در کد ("پنجره ایجاد کنید. انواع قابل اعتماد ایجاد خط مشی («برنامه»، {createHTML () {...}})).
منع تکالیف ناامن ("عنصر. innerHTML = "...) بدون انواع قابل اعتماد.
ادغام چارچوب (React/Angular/Vue): استفاده از API های رندر امن، جلوگیری از خطرناک بودن SetInnerHTML.
5) SRI (یکپارچگی CDN)
برای «<script> »/« <link>» خارجی، از «integrity =» sha256-... "crossorigin =" ناشناس" '.
مکمل های SRI، نه جایگزین، CSP. هنگام ارتقاء یک نسخه CDN، هش را به روز کنید.
6) Clickjacking و فریم ها
روش مدرن «frame-ancestors» است (جایگزین «X-Frame-Options» منسوخ شده است).