حمله 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 رو خنثی میکنید.