توسيع نطاق التجزئة المتوافقة في script-src

Carlos Joan Rafael Ibarra Lopez
Carlos Joan Rafael Ibarra Lopez
Mustafa Emre Acer
Mustafa Emre Acer

تاريخ النشر: 17 نوفمبر 2025

بدءًا من الإصدار 141 من Chrome، يمكنك الانضمام إلى التجربة الأصلية لاختبار ميزات "سياسة أمان المحتوى" (CSP) الجديدة التي يقدّمها Chrome. تساعد هذه الميزات المواقع الإلكترونية في حماية نفسها من نصوص برمجية للمواقع المتقاطعة من خلال السماح بشكل أفضل بالمصادر المعروفة لبرامج JavaScript. إنّ إدراج JavaScript المعروف في القائمة البيضاء وحظر جميع المصادر الأخرى هو طريقة فعّالة لمنع هجمات البرمجة النصية على المواقع (XSS). لن يتم إدراج JavaScript الذي أضافه المهاجم في القائمة المسموح بها، وبالتالي سيتم حظره.

وبدون هذه الميزات، يصعب توفير سياسة أمان محتوى "صارمة" تسمح بإدراج جميع مصادر JavaScript في القائمة المسموح بها بدون توفير آلية اتصال برقم الاستخدام لمرة واحدة بين مضيف البرنامج النصي والموقع الإلكتروني، أو معرفة التجزئة الكاملة للبرنامج النصي مسبقًا. ويصعب استخدام هاتين الطريقتين إذا كان النص البرمجي يتغيّر بشكل متكرر وتستضيفه جهة خارجية موثوقة ولكنها منفصلة. بالإضافة إلى ذلك، إذا كان أي نص برمجي يحتاج إلى استخدام eval، تتطلّب سياسة CSP حاليًا إدراج eval في القائمة المسموح بها لجميع النصوص البرمجية، ما يجعلها أضعف بكثير.

نحاول معالجة هذه المشكلة من خلال توفير آلية أكثر فعالية لإضافة عناوين URL إلى القائمة المسموح بها للنصوص البرمجية في script-src، وآلية لإضافة استدعاءات eval إلى القائمة المسموح بها. سيصبح بإمكانك استخدام آلية التجزئة الحالية في script-src لإضافة عناوين URL الخاصة بنصوص برمجية معيّنة إلى القائمة المسموح بها، بالإضافة إلى JavaScript الذي تم تمريره إلى eval (ودوال أخرى مشابهة لـ eval). مع أنّ السماح باستخدام قائمة عناوين URL قد لا يكون صارمًا مثل سياسة أمان المحتوى المستندة إلى السلامة، من المفترض أن تكون هذه الآلية تحسينًا كبيرًا على قائمة أسماء المضيفين المسموح بها الحالية.

ونعتقد أنّ ذلك يوفّر سياسة CSP أسهل في النشر وتظلّ فعّالة في الحدّ من هجمات XSS من خلال حظر النصوص البرمجية المضمّنة وغير المسموح بها. تم تصميم هذه الميزات الجديدة وتنفيذها بعناية لتمكين المواقع الإلكترونية من ضبط سياسة توفّر أمانًا أفضل في المتصفّحات التي تتوافق مع الوظيفة الجديدة، بدون التسبّب في حدوث مشاكل أو تراجع مستوى الأمان في المتصفّحات التي لا تتوافق معها، وبدون الحاجة إلى رصد وكيل المستخدم.

حالات الاستخدام

قائمة بعناوين URL مسموح بها لاستخدامها مع script-src

تتوفّر حاليًا خياران للمواقع الإلكترونية التي تريد إدراج نصوص برمجية معيّنة في القائمة المسموح بها لاستخدامها مع script-src: إدراج محتوى النصوص البرمجية في القائمة المسموح بها من خلال ميزة "سلامة الموارد الفرعية" (SRI)، أو استخدام host-source لإدراج أسماء المضيفين في القائمة المسموح بها. في كثير من الأحيان، لا يكون استخدام SRI عمليًا مع النصوص البرمجية التي تتغيّر بشكل متكرّر (مثل نصوص التحليلات البرمجية). سيتم تجاهل تحديد host-source عند ضبط strict-dynamic أيضًا، ولا يشكّل ذلك حماية شاملة لأنّه لا يتضمّن مَعلمات عناوين URL. سيسمح هذا التغيير بإدراج النصوص البرمجية في القائمة المسموح بها باستخدام قيمة تجزئة لعنوان URL (الكامل)، ما يتيح استخدام النصوص البرمجية الديناميكية والإعدادات التي تستخدم strict-dynamic.

إضافة نصوص برمجية معيّنة إلى القائمة المسموح بها لاستخدامها مع دوال eval أو دوال مشابهة

تتطلّب بعض المواقع الإلكترونية استخدام دوال eval أو دوال مشابهة (تمرير الرمز كقيم حرفية للسلسلة في setTimeout وsetInterval وsetImmediate). بالنسبة إلى هذه المواقع الإلكترونية، خيار CSP الوحيد المتاح لها هو unsafe-eval، والذي يتيح جميع طلبات eval. نحن بصدد إضافة آلية لإدراج مدخلات محدّدة في القائمة المسموح بها للدالة eval. تسمح هذه الآلية الجديدة بإضافة النصوص البرمجية المحدّدة المطلوبة إلى القائمة المسموح بها بشكل ضيق من خلال تجزئة محتوى النص البرمجي مباشرةً، بدلاً من الاضطرار إلى تقديم سياسة CSP واسعة النطاق وغير آمنة.

البدء

لتجربة ميزة التجزئة الخاصة بالنصوص البرمجية ودالة eval، انضم إلى مرحلة تجربة وتقييم تجزئة عناوين URL ودالة eval في CSP script-src، التي ستتوفّر من الإصدار 141 إلى 144 من Chrome.

إضافة رموز التجزئة إلى script-src

يتم إدراج عناوين URL في القائمة المسموح بها من خلال إضافة قيمة إلى توجيه script-src CSP بالتنسيق url-<hash-algorithm>-<script-url-hash>. سيسمح هذا الإجراء بتنفيذ أي محتوى يعرضه عنوان 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> في مصدر النص البرمجي. على سبيل المثال، سيسمح عنوان 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").

للمساعدة في بدء استخدام الميزة، عندما يوافق موقع إلكتروني على المشاركة في التجربة الأصلية، سيتم عرض رموز التجزئة لكل من عناوين 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. يمكنك نشر أي تعليقات كمشكلة على الشرح في GitHub.