---
title: "سكربت الـ CDN بموقعك ممكن يتغيّر: كيف تقفله بـ Subresource Integrity"
description: "زيد integrity مع crossorigin على كل سكربت أو ملف CSS جاي من سيرفر غيرك، والمتصفح بيرفض يحمّل الملف إذا محتواه ما طابق الـ hash يلي كتبته."
url: https://ihsanalapsi.dev/articles/subresource-integrity-cdn-scripts
lang: ar
date: 2026-11-01
updated: 2026-11-01
tags: ["أمن التطبيقات", "تطوير الويب", "أمن سلسلة التوريد"]
author: Ihsan Alapsi (إحسان العبسي)
---
# سكربت الـ CDN بموقعك ممكن يتغيّر: كيف تقفله بـ Subresource Integrity

أخطر سطر بموقعك ممكن يكون سطر ما كتبته إنت: وسم `<script>` بيجيب مكتبة من سيرفر غيرك. هالسطر بيشتغل بكل صلاحيات صفحتك، ومحتواه بيقرّره صاحب السيرفر، مش إنت. إذا موقعك بيحمّل سكربتات أو ملفات CSS من CDN، رح تعرف تحت كيف تقفلهن على النسخة يلي فحصتها، بأمر واحد وخاصيتين بالوسم.

## شو هو الـ Subresource Integrity؟

الـ Subresource Integrity (SRI) هو ميزة أمان بالمتصفح بتخليه يتأكد إنو الملف يلي جابه من برّا وصل بلا تعديل، بمقارنته بـ hash إنت كاتبه بالصفحة.

حسب [صفحة Subresource Integrity على MDN](https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Subresource_Integrity)، بتكتب بالوسم خاصية `integrity` فيها hash لمحتوى الملف، والملف لازم يطابقه. الـ hash هو بصمة بطول ثابت بتنحسب من كل بايت بالملف، وأي تغيير بالمحتوى بيعطي بصمة تانية.

## ليش رابط الـ CDN لحاله ما بيكفي؟

لأنو الرابط بيضل نفسه حتى لو المحتوى ورا الرابط تغيّر، والمتصفح بلا SRI بيشغّل أي شي بيرجع من هالعنوان.

الغلطة هون منطقية وبسيطة: منثق بالعنوان، مش بالمحتوى. منفحص المكتبة مرة وقت منضيفها، وبعدها منفترض إنو الملف على نفس الرابط بيضل نفسه لآخر العمر. بس إذا حدا وصل لحساب المكتبة أو لسيرفر الـ CDN، بيقدر يبدّل الملف، وكل موقع بيحمّله بيشغّل الكود الجديد بنفس اللحظة، وبصلاحيات صفحته كاملة. شفنا هالنوع من الهجوم على سلسلة التوريد بمقال [دودة npm يلي سرقت مفاتيح أدوات الـ AI](/articles/npm-testmetest-worm-ai-credentials).

سكربت معدّل بصفحتك بيقدر يقرا كل شي بتكتبه بالفورم، وبيقدر يقرا أي كوكي مش محمي بـ HttpOnly. لهيك افحص كمان [أقفال كوكي الجلسة بموقعك](/articles/session-cookie-flags-check).

## كيف بيوقف الـ hash الملف المعدّل؟

المتصفح بيحسب hash الملف يلي وصله وبيقارنه بالقيمة يلي بخاصية `integrity`: إذا تطابقوا بيحمّله، وإذا لأ بيرفض يحمّله وبيرجّع خطأ شبكة (network error).

يعني ما في داعي تعرف إذا الملف انسرق أو لأ. المهاجم بيقدر يبدّل الملف على الـ CDN، بس ما بيقدر يبدّل الـ hash المكتوب بصفحتك إنت، فالمتصفح بيوقّف الملف الجديد قبل ما يشتغل سطر منه. والخوارزميات المسموحة بالخاصية حسب صفحة MDN هي `sha256` و`sha384` و`sha512`، و[مواصفة Subresource Integrity عند W3C](https://www.w3.org/TR/SRI/) بتلزم المتصفحات تدعم SHA-256 وSHA-384 وSHA-512.

## كيف بتزيد integrity لسكربت عندك؟

بتحسب hash النسخة يلي بتستعملها، وبتكتبه بخاصية `integrity` مع `crossorigin="anonymous"`، وبعدين بتجرّب الصفحة.

1. اختار رابط لنسخة ثابتة من المكتبة، فيه رقم النسخة، مش رابط بيرجّع آخر نسخة. بيطلع معك ملف ما بيتغيّر إلا إذا إنت غيّرت الرابط.
2. نزّل هالملف واحسب الـ hash تبعه بالأمر يلي بتعطيه صفحة MDN (بدّل `FILENAME.js` باسم الملف):

```bash
cat FILENAME.js | openssl dgst -sha384 -binary | openssl base64 -A
```

3. حط الناتج بالوسم بعد `sha384-`، وزيد `crossorigin="anonymous"`:

```html
<script
  src="LIBRARY_URL"
  integrity="sha384-الناتج-يلي-طلع-معك"
  crossorigin="anonymous"></script>
```

4. افتح الصفحة وشوف الـ Console بأدوات المطوّر: إذا الملف ما حمّل، يا الـ hash محسوب من نسخة تانية، يا سيرفر الـ CDN ما بيبعت ترويسة CORS.

نفس الشي لملفات الـ CSS: الخاصيتين بيتحطّوا على وسم `<link rel="stylesheet">`.

## ليش لازم crossorigin مع integrity؟

لأنو المتصفح ما بيقبل SRI على ملف من سيرفر تاني إلا إذا الطلب ماشي بـ CORS، وبلا `crossorigin` الطلب بيفشل دايماً.

صفحة MDN بتشرح السبب: الملف يلي بيتحمّل من الـ HTML بيروح افتراضياً بوضع `no-cors`، وبهالوضع الـ SRI ممكن يسرّب لمهاجم معلومات عن محتوى ملف ما بيحقله يقراه. لهيك المتصفح ما بيسمح بـ SRI على طلب `no-cors`، والسيرفر يلي عليه الملف لازم يرد بترويسة `Access-Control-Allow-Origin`. أغلب الـ CDN العامة بتبعتها، بس الخطوة 4 فوق هي يلي بتأكدلك.

## كيف بتلاقي السكربتات يلي لسا بلا integrity؟

دوّر بالكود وبقوالب الصفحات على كل `<script src>` وكل `<link rel="stylesheet">` رابطه لدومين غير دومينك، وشوف إذا معه `integrity`.

وفي [ترويسة أحدث اسمها Integrity-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Integrity-Policy) بتخلي المتصفح يتأكد إنو كل السكربتات أو ملفات الـ CSS عليها SRI. بس MDN بتعلّمها «Limited availability»، يعني ما بتشتغل بكل المتصفحات المنتشرة، فاعتبرها شبكة أمان زيادة، مش بديل عن البحث بإيدك.

وإذا بتستعمل مكتبات من CDN بـ GitHub Actions أو بخطوات البناء، نفس الفكرة بتنطبق هونيك: ثبّت النسخة بدل الاسم، متل ما شرحنا بمقال [قفل نسخ الـ actions](/articles/github-actions-workflow-lockfiles).

## من وين تبلّش اليوم؟

افتح الصفحة الرئيسية لموقعك، وعدّ السكربتات الجاية من دومين تاني، وزيد `integrity` و`crossorigin` لأول واحد منهن اليوم.

الدرس إلنا كمطوّرين: الرابط عنوان، مش ضمانة. لما بتقفل كل ملف من برّا على hash النسخة يلي فحصتها، أي تبديل بالمحتوى بيوقف عند المتصفح قبل ما يوصل لمستخدمينك.

إذا بدك حدا يفحص السكربتات والمكتبات يلي بتحمّلها منصتك، مع باقي الثغرات، [مُحَصَّن بيفحص منصتك وبيسلّمك خطة إصلاح واضحة](/muhassan).

## FAQ

**إذا السكربت على سيرفري أنا، بيلزمه integrity؟**

غالباً لأ. الخطر الأكبر بالملفات يلي جاية من سيرفر ما بتتحكم فيه، متل الـ CDN. الملف على سيرفرك بيحميه أمان سيرفرك نفسه.

**شو بيصير إذا الـ CDN حدّث الملف بنفس الرابط؟**

المتصفح بيرفض يحمّله لأنو الـ hash ما عاد بيطابق، والميزة يلي بتعتمد عليه بتوقف. لهيك استعمل رابط لنسخة ثابتة، مش لآخر نسخة.

**أي خوارزمية hash أستعمل؟**

sha384 هو الشائع بالأمثلة، وsha256 وsha512 مقبولين كمان. المهم إنك تحسب الـ hash من النسخة نفسها يلي فحصتها.

**هل integrity بيغني عن Content Security Policy؟**

لأ. integrity بيتأكد إنو ملف معيّن ما تغيّر، والـ CSP بيحدد من وين بيقدر موقعك يحمّل سكربتات أصلاً. الاتنين بيكمّلوا بعض.
