گسترش هش‌های پشتیبانی‌شده در script-src

کارلوس خوان رافائل ایبارا لوپز
Carlos Joan Rafael Ibarra Lopez
مصطفی امره ایسر
Mustafa Emre Acer

منتشر شده: ۱۷ نوامبر ۲۰۲۵

از کروم ۱۴۱، می‌توانید به نسخه آزمایشی اصلی بپیوندید تا ویژگی‌های جدید سیاست امنیت محتوا (CSP) که کروم معرفی می‌کند را آزمایش کنید. این ویژگی‌ها به وب‌سایت‌ها کمک می‌کنند تا با فهرست‌بندی بهتر منابع شناخته‌شده جاوا اسکریپت، از خود در برابر XSS محافظت کنند. فهرست‌بندی جاوا اسکریپت شناخته‌شده و مسدود کردن سایر منابع، راهی مؤثر برای جلوگیری از XSS است. جاوا اسکریپت تزریق‌شده توسط مهاجم در فهرست مجاز قرار نمی‌گیرد و بنابراین مسدود می‌شود.

بدون این ویژگی‌ها، داشتن یک CSP «دقیق» که تمام منابع جاوا اسکریپت را بدون داشتن مکانیسم ارتباطی nonce بین میزبان اسکریپت و سایت، یا دانستن هش کامل اسکریپت از قبل، فهرست کند، دشوار است. اگر اسکریپت هم مرتباً تغییر کند و هم توسط یک شخص ثالث قابل اعتماد اما جداگانه میزبانی شود، پیاده‌سازی هر دوی این روش‌ها دشوار است. علاوه بر این، اگر هر اسکریپتی نیاز به استفاده از eval داشته باشد، CSP در حال حاضر مستلزم آن است که eval را برای همه اسکریپت‌ها فهرست کنید، که آن را بسیار ضعیف‌تر می‌کند.

ما در تلاشیم تا با ارائه مکانیسم قوی‌تری برای فهرست‌بندی مجاز اسکریپت‌ها بر اساس URL در script-src و مکانیسمی برای فهرست‌بندی مجاز فراخوانی‌های eval، این شکاف را برطرف کنیم. شما قادر خواهید بود از مکانیسم هش موجود در script-src برای فهرست‌بندی مجاز URLهای اسکریپت‌های خاص و جاوا اسکریپت ارسال شده به eval (و سایر توابع مشابه eval) استفاده کنید. اگرچه فهرست‌بندی مجاز مبتنی بر URL شاید به اندازه CSP مبتنی بر یکپارچگی دقیق نباشد، اما این مکانیسم باید پیشرفت بزرگی در فهرست مجاز نام میزبان موجود باشد.

ما معتقدیم که این امر، پیاده‌سازی سیاست CSP را آسان‌تر می‌کند که همچنان با مسدود کردن اسکریپت‌های درون‌خطی و ارزیابی غیرمجاز، XSS را به طور قوی کاهش می‌دهد. این ویژگی‌های جدید با دقت طراحی و پیاده‌سازی شده‌اند تا سایت‌ها بتوانند سیاستی را تنظیم کنند که امنیت بهتری را در مرورگرهایی که از قابلیت‌های جدید پشتیبانی می‌کنند، فراهم کند، بدون اینکه باعث خرابی یا کاهش امنیت در مرورگرهایی شود که از این قابلیت‌ها پشتیبانی نمی‌کنند، بدون اینکه نیازی به انجام شنود عامل کاربر باشد.

موارد استفاده

لیست کردن آدرس‌های اینترنتی خاص برای استفاده با script-src

سایت‌هایی که می‌خواهند اسکریپت‌های خاصی را برای استفاده با script-src فهرست کنند، در حال حاضر دو گزینه دارند: فهرست کردن محتوای اسکریپت‌ها از طریق یکپارچگی زیرمنبع (SRI)، یا استفاده host-source برای فهرست کردن نام‌های میزبان. SRI اغلب برای اسکریپت‌هایی که مرتباً تغییر می‌کنند (مثلاً اسکریپت‌های تحلیلی) عملی نیست. مشخص کردن host-source هنگام تنظیم strict-dynamic نادیده گرفته می‌شود و یک محافظت جامع نیست، زیرا پارامترهای URL را شامل نمی‌شود. این تغییر به اسکریپت‌ها اجازه فهرست کردن با استفاده از هش URL (کامل) آنها را می‌دهد و از اسکریپت‌های پویا و پیکربندی‌هایی که strict-dynamic استفاده می‌کنند، پشتیبانی می‌کند.

اسکریپت‌های خاص را برای استفاده با توابع eval یا توابع شبیه eval در لیست مجاز قرار دهید

برخی سایت‌ها نیاز به استفاده از توابع eval یا توابع شبیه به eval دارند (ارسال کد به عنوان رشته‌های لیترال در setTimeout ، setInterval و setImmediate ). برای این سایت‌ها، تنها گزینه CSP موجود برای آنها unsafe-eval است که همه فراخوانی‌های eval را فعال می‌کند. ما در حال اضافه کردن مکانیزمی برای مجاز کردن لیست کردن ورودی‌های خاص به eval هستیم. این مکانیزم جدید، به جای اینکه مجبور به ارائه یک CSP بیش از حد گسترده unsafe-eval شویم، امکان لیست کردن دقیق اسکریپت‌های خاص مورد نیاز را با هش کردن مستقیم محتوای اسکریپت فراهم می‌کند.

شروع کنید

برای امتحان کردن پشتیبانی از هش کردن اسکریپت و eval، URL و هش‌های eval را در نسخه آزمایشی CSP script-src origin که از کروم ۱۴۱ تا ۱۴۴ اجرا می‌شود، به هم متصل کنید.

اضافه کردن هش‌ها به script-src

URLها با اضافه کردن مقداری به دستورالعمل script-src CSP به شکل url-<hash-algorithm>-<script-url-hash> در فهرست مجاز قرار می‌گیرند. این کار به هر محتوایی که آن URL ارائه می‌دهد، صرف نظر از محتوا، اجازه اجرا می‌دهد. هش فقط باید شامل URL اولیه (URL موجود در صفحه) باشد، نه هر URL که آن URL به آن هدایت می‌شود. هر دو URL مطلق و نسبی پشتیبانی می‌شوند.

برای مثال، هدر CSP زیر اسکریپت ارائه شده در https://example.com/example.js را مجاز به نمایش در لیست می‌کند:

Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';

که در آن 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' هش sha256 مربوط به ' https://example.com/example.js ' است.

اسکریپت‌هایی که از طریق تابع eval یا new Function ارزیابی می‌شوند، می‌توانند با اضافه کردن eval-<hash-algorithm>-<script-contents-hash> به script src در لیست مجاز قرار گیرند. برای مثال، هدر CSP زیر، رشته alert("hello world") را به eval() ارسال می‌کند:

Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';

که در آن 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=' هش sha256 مربوط به alert("hello world") است.

برای کمک به پذیرش بوت‌استرپ، وقتی سایتی در آزمایش origin شرکت می‌کند، هش‌های مربوط به URLها و eval در کنسول DevTools چاپ می‌شوند و در گزارش‌های CSP گنجانده می‌شوند. این به این معنی است که می‌توان از یک سیاست سختگیرانه، اما report-only ، برای شمارش تمام هش‌های مورد نیاز برای فهرست‌بندی مجاز استفاده کرد.

حفظ سازگاری با نسخه‌های قبلی

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

Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

ما همچنین strict-dynamic-url را معرفی کرده‌ایم، معادل strict-dynamic که فقط زمانی اعمال می‌شود که هش‌های URL تنظیم شده باشند. از آنجایی که strict-dynamic باعث می‌شود لیست‌های مجاز مبتنی بر میزبان نادیده گرفته شوند، سایتی که می‌خواهد یک هش خاص را به صورت مجاز لیست کند و strict dynamic روی آن اعمال شود، می‌تواند از سیاستی مانند زیر استفاده کند:

Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

در این مثال، مرورگرهایی که هنوز از هش‌ها پشتیبانی نمی‌کنند، فقط https: را اجرا می‌کنند. unsafe-eval به طور مشابه توسط مرورگرهای پشتیبانی‌کننده در صورت وجود هش‌های eval نادیده گرفته می‌شود. برای مثال، سیاست زیر به عنوان unsafe-eval ارزیابی خواهد شد. این امر امکان استفاده از eval() را در مرورگرهایی که هنوز از هش‌های eval پشتیبانی نمی‌کنند، فراهم می‌کند، در حالی که فقط eval() مربوط به alert("hello world") را در بین مرورگرهایی که از هش‌های eval پشتیبانی می‌کنند، مجاز می‌داند.

  Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"

بازخورد را به اشتراک بگذارید

ما علاقه‌مند به دریافت بازخورد توسعه‌دهندگان در مورد این افزونه‌ها در script-src هستیم. هرگونه نظری را به عنوان یک مشکل در توضیح‌دهنده در گیت‌هاب ارسال کنید.