Defaults.Exposed

Defaults.Exposedرفع اشکال‌ها › Content-Security-Policy (CSP)

چطور Content-Security-Policy (CSP) را رفع کنید

یک Content Security Policy یک قانون امنیتی است که وب‌سایت شما به مرورگر هر بازدیدکننده می‌دهد و به آن می‌گوید دقیقاً کدام کدها مجاز هستند اجرا شوند. بدون آن، اگر چیز مخربی روی یک صفحه قرار گیرد — از طریق یک کادر نظر، یک پلاگین هک شده، یا یک اسکریپت شخص ثالث — مرورگر آن را آزادانه اجرا می‌کند، از جمله کدی که به‌آرامی شماره‌های کارت و رمزهای عبور مشتریان شما را هنگام تایپ می‌کشد، در حالی که قفل همچنان نمایش می‌دهد.

نتیجه نهایی برای کسب‌وکار شما: اگر سایت شما دستکاری شود، کد مخرب می‌تواند اطلاعات کارت پرداخت و ورود به سیستم مشتریان شما را مستقیماً از صفحه‌ی پرداخت شما بخواند در حالی که همه چیز کاملاً عادی به نظر می‌رسد — که برای شما chargebacks، ادعاهای تقلب، یک نقض داده‌ی قابل گزارش، و یک شکست بررسی که تیم‌های امنیتی مشتریان بزرگ‌تر برای توقف یا از دست دادن معامله استفاده می‌کنند به همراه می‌آورد.

هزینه این برای شما

چرا اهمیت دارد. قفل اثبات می‌کند اتصال به سایت شما خصوصی است، اما هیچ‌کاری برای کنترل اینکه چه کدی پس از اینکه بازدیدکننده روی صفحه است اجرا می‌شود انجام نمی‌دهد. یک Content Security Policy محافظتی است که این کار را می‌کند — به مرورگرها می‌گوید هر اسکریپتی را که از منبعی که اعتماد دارید نیامده نادیده بگیرند، پس یک فیلد دستکاری شده تنها، تبلیغ، یا پلاگین نمی‌تواند به ابزاری برای دزدیدن پول و داده‌های مشتریان شما تبدیل شود.

این چیست، به زبان ساده

وقتی کسی از وب‌سایت شما بازدید می‌کند، مرورگرش صفحه را دانلود می‌کند و هر کدی که روی آن است اجرا می‌کند. به طور پیش‌فرض، مرورگر همه را اعتماد می‌کند. هیچ راهی برای دانستن اینکه کدام کد واقعاً از شماست و کدام توسط کس دیگری پنهان شده ندارد.

یک Content Security Policy (که اغلب به CSP کوتاه می‌شود) یک لیست کوتاه از قوانین است که وب‌سایت شما به هر صفحه ضمیمه می‌کند و به مرورگر می‌گوید: «فقط کدی از این منابعی که تأیید کرده‌ام اجرا کن و همه چیز دیگر را رد کن.»

دلیل اینکه این اینقدر مهم است: وب‌سایت‌ها مداوم دستکاری می‌شوند — نه همیشه با هک کردن سرور شما، بلکه از طریق درهای پشتی که بیشتر سایت‌ها باز می‌گذارند: یک کادر نظر، یک جعبه‌ی جستجو، یک پلاگین قدیمی، یک اسکریپت شخص ثالث برای تبلیغات یا analytics، یا یک ویجت چت.

این چقدر ممکن است برای شما هزینه داشته باشد

این انتزاعی نیست. حمله‌ای که یک Content Security Policy پیشگیری می‌کند — کد تزریق شده به صفحه که داده را از مشتریان خودتان می‌دزدد — پشت برخی از بزرگ‌ترین نقض‌های card-skimming ثبت شده است:

در واقع چیست (جزئیات)

یک Content Security Policy به عنوان یک HTTP response header تنها ارسال می‌شود. مقدار آن مجموعه‌ای از دستورالعمل‌ها است. مثلاً:

Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'

به زبان ساده: به طور پیش‌فرض فقط چیزهایی از سایت خودم را بارگذاری کن؛ فقط اسکریپت‌های سایت خودم را اجرا کن؛ هیچ پلاگین قدیمی را اجازه نده.

«خوب» چه شکلی است. بررسی ما فقط به دنبال حضور header نیست — سیاست را دستورالعمل به دستورالعمل می‌خواند و امتیاز می‌دهد. یک سیاست قوی:

چگونه آن را رفع کنیم (رایگان، ~۱–۲ ساعت)

این را به IT یا هر کسی که وب‌سایت شما را اجرا می‌کند بدهید — خود اصلاح کاملاً رایگان است.

  1. در حالت report-only شروع کنید — هنوز اجرا نکنید. یک Content-Security-Policy-Report-Only response header اضافه کنید. این تماشا و ثبت می‌کند چه چیزی بلاک می‌شد بدون اینکه چیزی را واقعاً بلاک کند.

  2. سیاست را از آنچه سایت شما واقعاً استفاده می‌کند بسازید. گزارش‌ها را مرور کنید تا هر منبع مشروع اسکریپت‌ها، استایل‌ها، فونت‌ها و تصاویر را پیدا کنید.

  3. از حفره‌هایی که کل هدف را شکست می‌دهند پرهیز کنید. از 'unsafe-inline' و 'unsafe-eval' برای اسکریپت‌ها و از منابع wildcard مثل * دور بمانید.

  4. framing و پلاگین‌ها را قفل کنید. frame-ancestors 'self' و object-src 'none' اضافه کنید.

  5. از report-only به enforcing تبدیل کنید. نام header را از Content-Security-Policy-Report-Only به Content-Security-Policy تغییر دهید. این مرحله‌ای است که واقعاً محافظت ارائه می‌دهد.

    کجا header را تنظیم کنید، بسته به پلتفرم:

    • Cloudflare: Rules → Transform Rules → Modify Response Header
    • Nginx: add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';" always;
    • Apache: Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';"
  6. دامنه‌ی خود را مجدداً بررسی کنید تا تأیید کنید سیاست روشن و enforcing است.

اشتباهات رایج

پرسش‌های متداول

من تکنیکی نیستم — آیا می‌توانم خودم این را حل کنم؟

نیازی نیست جزئیات را بفهمید. این یک تنظیم است که توسط هر کسی که وب‌سایت یا هاستینگ شما را اجرا می‌کند اضافه می‌شود. بخش 'چگونه آن را رفع کنیم' را به آن‌ها بدهید. رایگان است؛ یک احتیاط این است که باید ابتدا در حالت watch-only آزمایش شود.

قفل دارم و گواهینامه‌ی SSL — مگر سایتم امن نیست؟

قفل تحویل صفحه‌ی شما را ایمن می‌کند؛ کنترل نمی‌کند چه چیزی داخل آن اجرا می‌شود. اگر کد مخرب روی یک صفحه قرار گیرد، قفل آن را از دزدیدن داده متوقف نمی‌کند. یک Content Security Policy لایه‌ای است که محدود می‌کند اصلاً چه چیزی مجاز است اجرا شود.

آیا روشن کردن این می‌تواند سایتم را بشکند؟

اگر همه‌چیز به طور تهاجمی یکجا روشن شود می‌تواند، چون ممکن است اسکریپت‌های مشروعی که واقعاً استفاده می‌کنید را بلاک کند. به همین دلیل رویکرد استاندارد شروع در حالت 'report-only' است که بدون بلاک تماشا می‌کند.

قبلاً آن را در حالت 'report-only' گذاشته‌ایم — مگر پوشش داریم؟

نه، و این رایج‌ترین حس امنیت کاذب است. حالت report-only تماشا و ثبت می‌کند چه چیزی بلاک می‌شد، اما هیچ‌چیزی را بلاک نمی‌کند — بازدیدکنندگان هیچ محافظت واقعی دریافت نمی‌کنند. فقط اولین مرحله‌ی ایمن است. فقط وقتی به حالت enforcing بروید محافظت دارید.

آیا این بر نمره تأثیر می‌گذارد، یا فقط مشاوره است؟

بر نمره تأثیر می‌گذارد. بررسی Content Security Policy نمره‌گذاری شده است و تا ۲۵ امتیاز در دسته‌ی Web Security ارزش دارد.

توسعه‌دهنده ما یک سیاست اضافه کرده اما نمره همچنان پایین است — چرا؟

یک سیاست می‌تواند وجود داشته باشد و همچنان ضعیف باشد. رایج‌ترین مجرمان حفره‌هایی مثل 'unsafe-inline' و 'unsafe-eval' برای اسکریپت‌ها، یا منابع wildcard (یک bare *) هستند که دقیقاً همان شکافی را که سیاست قرار است ببندد دوباره باز می‌کنند.