0Pricing
HTML Academy · درس

XSS عبر innerHTML وكيفية منعه

فهم البرمجة النصية عبر المواقع والبدائل الآمنة لـ innerHTML

XSS عبر innerHTML وكيفية منعه درس مجاني في HTML Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في HTML Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة HTML Academy 4 دروس في المجموع.

الثغرة الأساسية

يحلّل el.innerHTML = userInput السلسلة النصية على أنها HTML. إذا احتوت userInput على علامات <script> أو سمات معالجات أحداث (onclick وonerror)، فسيفسرها المتصفح وينفّذ التعليمات البرمجية التي يتحكم بها المهاجم على الصفحة.

لماذا هي شائعة؟

تعرّض أي شيفرة تدرج بيانات المستخدم في HTML — مثل قوالب الخادم أو العرض من جهة العميل — التطبيق لخطر XSS إذا لم تُهرب البيانات. وتكون تطبيقات الصفحة الواحدة التي تنشئ innerHTML من استجابات API معرضة للخطر بشكل خاص عندما تتضمن تلك الاستجابات محتوى من المستخدم.

مثال ملموس

يؤدي اسم المستخدم "Bob<img src=x onerror=alert(1)>"، عند تعيينه باستخدام div.innerHTML = `Welcome, ${user}`، إلى تنفيذ alert(1) عندما يفشل img في التحميل. أما الحمولة نفسها كنص عادي (باستخدام textContent) فهي غير ضارة — إذ يرى المتصفح أحرفًا فقط، لا علامات.

// VULNERABLE
div.innerHTML = `Hi, ${user.name}`;

// SAFE
div.textContent = `Hi, ${user.name}`;

استخدم textContent للنص العادي

يعيّن textContent النص فقط — فتظهر أحرف HTML الخاصة كأحرف حرفية، ولا تُفسَّر أبدًا على أنها علامات. وهذه هي الأداة المناسبة في 90% من الحالات. انتقل إلى innerHTML فقط عندما تحتاج فعليًا إلى عرض ترميز، لا نص.

استخدم أساليب DOM للبنية

لإنشاء عناصر تحتوي على بيانات المستخدم، أنشئها باستخدام createElement وtextContent: const li = document.createElement("li"); li.textContent = name; ul.appendChild(li);. والنتيجة مطابقة بنيويًا لـ innerHTML، لكنها آمنة من XSS بحكم تصميمها.

متى يجب استخدام innerHTML؟

بالنسبة إلى HTML موثوق ينشئه الخادم (مثل ناتج القالب الخاص بك أو النص المنسق المنقّى من محرر موثوق)، لا مشكلة في استخدام innerHTML. لا تطبّقه مباشرةً على البيانات الواردة من مصادر غير موثوقة من دون تنقية.

نقِّ النص المنسق باستخدام DOMPurify

إذا أرسل المستخدمون نصًا منسقًا (مثل محرر التعليقات أو عرض Markdown)، فنقِّه قبل تعيين innerHTML: el.innerHTML = DOMPurify.sanitize(richHtml). يزيل DOMPurify العلامات والسمات الخطرة مع الإبقاء على التنسيق الآمن مثل <b> و<em> و<a>.

يحمل insertAdjacentHTML الخطر نفسه

يحلّل el.insertAdjacentHTML("beforeend", html) سلاسل HTML — أي إنه يعرّضك لسطح XSS نفسه الذي يسببه innerHTML. وتنطبق القواعد نفسها: لا تمرر بيانات المستخدم مباشرةً؛ نقِّها أو استخدم أساليب DOM. وينطبق الأمر نفسه على document.write، مع أنه لا ينبغي لأحد استخدامه بعد الآن.

الإعدادات الافتراضية لأطر العمل

تهرب React وVue وSvelte وAngular النص المضمّن افتراضيًا — إذ إن {name} آمن. لكنها توفر طرقًا لتجاوز ذلك (dangerouslySetInnerHTML في React وv-html في Vue)، وتحمل هذه الطرق خطر XSS نفسه؛ فاستخدمها باعتدال مع التنقية.

حقن السمات

حتى قيم السمات قد تكون وسيلة للهجوم: <a href={url}> مع url="javascript:alert(1)" ينفّذ الشيفرة عند النقر. تحقّق من عناوين URL مخططًا تلو الآخر (واسمح فقط بـ http: وhttps: وmailto: وtel:) قبل وضع مدخلات المستخدم في href أو src أو أي سمات أخرى تحمل عناوين URL.

سياسة Trusted Types

تدعم المتصفحات الحديثة Trusted Types: اضبط CSP باستخدام require-trusted-types-for 'script'، وعندها يرفض innerHTML السلاسل الخام — ولا تمر إلا القيم المغلّفة بواسطة سياسة. وهذا يجعل XSS مستحيلًا بفضل واجهة البرمجة، لا بفضل الانضباط وحده.

الدفاع متعدد الطبقات

لا تكفي أي طبقة واحدة. اجمع بين: التحقق من المدخلات على الخادم، وتهريب المخرجات عند العرض، واستخدام CSP لحظر البرامج النصية المحقونة، واستخدام Trusted Types لرفض السلاسل الخام، وإجراء مراجعة أمنية لأي استخدام لـ innerHTML. يصمد الدفاع متعدد الطبقات أمام وجود خلل في أي طبقة منفردة.

اختبار المعرفة

لماذا يُعد el.textContent = userInput آمنًا من XSS، بينما يُعد el.innerHTML = userInput خطيرًا؟

الملخص

يُعد innerHTML مع مدخلات المستخدم ناقل XSS الكلاسيكي. استخدم textContent للنصوص، وcreateElement+textContent لبناء البنية، واستخدم DOMPurify عند الحاجة إلى HTML منسق. تحقّق من مخططات عناوين URL لقيم السمات. طبّق CSP وTrusted Types لتحييد الأخطاء التي تتسلل عبر مراجعة الشيفرة. تهرّب أُطر العمل الحديثة من المخرجات افتراضيًا — فاجعل مخارج تجاوزها غير الآمنة نادرة وخاضعة للمراجعة.

الأسئلة الشائعة

هل درس «XSS عبر innerHTML وكيفية منعه» مجاني؟

نعم — نص درس «XSS عبر innerHTML وكيفية منعه» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة HTML Academy، انتقل إلى CoddyKit PRO. تتضمن دورة HTML Academy 4 دروس في المجموع.

ماذا ستتعلم في «XSS عبر innerHTML وكيفية منعه»؟

فهم البرمجة النصية عبر المواقع والبدائل الآمنة لـ innerHTML تتمرن على HTML Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ HTML Academy؟

لا تُشترط خبرة سابقة. HTML Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «XSS عبر innerHTML وكيفية منعه»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس HTML Academy هذا؟

نعم. كل درس في HTML Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Content Security Policy وmeta http-equiv
  2. XSS عبر innerHTML وكيفية منعه
  3. وضع الحماية لإطارات iframe وسياسة الأذونات
  4. HTTPS وسلامة الموارد الفرعية
← العودة إلى HTML Academy