حدّد نواقل XSS الخاصة بالترميز، وانشر دفاعات HTML الأصلية: sandbox وnoopener وسياسة أمان المحتوى.
افتح هذا الدرس في Kodokonسياق الهروب (escaping) يصنع كل الفرق: قيمة غير مؤذية في عقدة نصية تصبح قابلة للتنفيذ في سمة. السمة غير المحاطة بعلامات اقتباس هي الحالة الأسوأ: مسافة واحدة في البيانات المحقونة تكفي لإنشاء سمة جديدة، مثل مُعالِج onmouseover. وحتى عند إحاطتها بعلامات اقتباس بشكل سليم، تبقى القيمة خطيرة في المصارف (sinks) الحسّاسة: href وsrc يقبلان مخطّط javascript:، وformaction يخطف إرسال نموذج، وsrcdoc يفسّر كياناته كـ HTML بمجرد فكّ ترميزها.
<!-- userName = x onmouseover=alert(1) -->
<img src="avatar.png" alt=x onmouseover=alert(1)>
<!-- The unquoted attribute lets a handler in -->تجرّد سمة sandbox في iframe جميع الامتيازات، ثم تمنحها من جديد واحدةً واحدة: allow-scripts، allow-forms، allow-popups... بدون allow-same-origin، يتلقى المستند المُضمَّن أصلًا مبهمًا (opaque origin): لا كوكيز، لا تخزين، لا وصول إلى DOM الأب - حتى لو كان مُقدَّمًا من نطاقك ذاته.
<iframe
src="https://widget.example.com"
sandbox="allow-scripts allow-forms"
referrerpolicy="no-referrer">
</iframe>الرابط target=_blank كان يمنح الصفحة المفتوحة تاريخيًا مرجع window.opener إلى علامة تبويبك: كان يمكنها إعادة توجيه صفحتك إلى نسخة تصيّد، وهو الهجوم المعروف بـ الاستيلاء على التبويب (tabnabbing). تطبّق المتصفحات الحديثة الآن noopener ضمنيًا على target=_blank، لكن كتابته صراحة يبقى أساسيًا لـ window.open في JavaScript ولتوثيق النية؛ أضف noreferrer لإلغاء ترويسة Referer أيضًا.
<a href="https://external.example"
target="_blank"
rel="noopener noreferrer">
View the external resource
</a>تقيّد سياسة أمان المحتوى (Content Security Policy) مصادر الشفرة القابلة للتنفيذ وتُبطل معظم هجمات XSS، حتى عند نجاح الحقن. وحين تُصرَّح عبر وسم <meta http-equiv>، فإن لها مع ذلك نقاطًا عمياء: التوجيهات frame-ancestors وreport-uri وsandbox تُتجاهل فيه وتتطلب ترويسة HTTP. فضّل الأرقام العشوائية لمرة واحدة (nonces) المُولَّدة من جديد في كل استجابة على قوائم النطاقات المسموح بها، التي يجعلها التوجيه strict-dynamic بائدة على أي حال.
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'nonce-r4nd0m'">allow-scripts وallow-same-origin على iframe من الأصل ذاته حماية sandbox؟rel=noopener؟window.opener لإعادة توجيه علامة تبويبك إلى موقع تصيّد<meta http-equiv>؟