حمله XSS (Cross-Site Scripting) یکی از رایج‌ترین آسیب‌پذیری‌های وب هست. CSP یه Header قدرتمنده که با تعریف قوانین دقیق، تقریباً همه XSS ها رو بلاک میکنه.

CSP چیه؟

Content Security Policy یه HTTP Header هست که به مرورگر میگه: فقط از منابع مشخص Script، Style، Image، Font و... بارگذاری کن.

مثال ساده

Content-Security-Policy: default-src 'self'

یعنی فقط از دامنه خود سایت منابع بارگذاری کن. Inline script، Third-party script بلاک میشن.

Directives اصلی

default-src: پیش‌فرض برای همه چی
script-src: JavaScript منابع
style-src: CSS منابع
img-src: تصاویر
font-src: فونت‌ها
connect-src: AJAX، WebSocket
frame-src: iframe
media-src: video، audio

Sources

'self': فقط دامنه خودتون
'none': هیچی
'unsafe-inline': کد inline (خطرناک)
'unsafe-eval': eval() (خطرناک)
domain.com: از این دامنه
*.domain.com: از هر ساب‌دامین
data:: از data URI
https:: از هر HTTPS

مثال کامل

Content-Security-Policy:
default-src 'self';
script-src 'self' https://cdn.jsdelivr.net;
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
img-src 'self' data: https:;
font-src 'self' https://fonts.gstatic.com;
connect-src 'self' https://api.example.com;

Nonce و Hash

برای inline script بدون unsafe-inline:

Nonce

Content-Security-Policy: script-src 'nonce-random123'
<script nonce="random123">...</script>

Hash

Content-Security-Policy: script-src 'sha256-abc...'
مرورگر Hash script رو محاسبه میکنه.

Report-Only Mode

برای تست، اول Report-Only بذارید:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report

خطاها بلاک نمیشن، فقط گزارش میشن.

report-uri

آدرسی که گزارش‌ها بهش فرستاده میشه. لاگ کنید تا مشکلات رو پیدا کنید.

راه‌اندازی CSP گام به گام

مرحله ۱: Audit

تمام Resource های سایت رو لیست کنید. کجا از میان؟

مرحله ۲: Report-Only

یه CSP اولیه با Report-Only بذارید.

مرحله ۳: بررسی گزارش‌ها

هفته‌ای یک بار گزارش‌ها رو بخونید. سیاست رو تنظیم کنید.

مرحله ۴: Enforce

وقتی مطمئن شدید، Content-Security-Policy رو فعال کنید.

Common Mistakes

Unsafe-inline زیاد

خیلی وسوسه‌کنندست ولی امنیت رو خراب میکنه.

ستاره زیاد

* اجازه به همه رو میده. حتی الامکان مشخص باشید.

عدم تست

حتماً از Report-Only شروع کنید.

CSP و WordPress

WordPress خیلی inline script داره. راه‌حل: Nonce یا استفاده از پلاگین‌های CSP.

WordPress پلاگین

HTTP Headers: راحت
WP Content Security Policy: حرفه‌ای

Analytics و CSP

Google Analytics نیاز به www.google-analytics.com. اضافه کنید به script-src و img-src.

reCAPTCHA و CSP

script-src www.google.com
frame-src www.google.com

Content-Security-Policy vs X-Frame-Options

X-Frame-Options قدیمیه ولی CSP frame-ancestors جایگزینشه.

SVG و CSP

SVG میتونه script داشته باشه. اگه از SVG استفاده میکنید، مواظب باشید.

Chrome DevTools

Console بلاک‌های CSP رو نشون میده. برای دیباگ عالیه.

Frame-ancestors

جلوگیری از Clickjacking:
frame-ancestors 'none'

سایت شما نمیتونه در iframe نمایش داده بشه.

Upgrade-insecure-requests

URL های HTTP رو خودکار به HTTPS تبدیل میکنه:
Content-Security-Policy: upgrade-insecure-requests

سباهاست

راه‌اندازی CSP روی هاست سباهاست ساده‌ست. تیم فنی راهنمایی میکنه.

جمع‌بندی

CSP یکی از قدرتمندترین ابزارهای امنیت وب هست. با تنظیم دقیق، تقریباً همه حملات XSS رو خنثی میکنید.