Kodokon kodokon.com

الأمان من جهة HTML: XSS وsandbox وnoopener وCSP

حدّد نواقل XSS الخاصة بالترميز، وانشر دفاعات HTML الأصلية: sandbox وnoopener وسياسة أمان المحتوى.

11 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

سياق الهروب (escaping) يصنع كل الفرق: قيمة غير مؤذية في عقدة نصية تصبح قابلة للتنفيذ في سمة. السمة غير المحاطة بعلامات اقتباس هي الحالة الأسوأ: مسافة واحدة في البيانات المحقونة تكفي لإنشاء سمة جديدة، مثل مُعالِج onmouseover. وحتى عند إحاطتها بعلامات اقتباس بشكل سليم، تبقى القيمة خطيرة في المصارف (sinks) الحسّاسة: href وsrc يقبلان مخطّط javascript:، وformaction يخطف إرسال نموذج، وsrcdoc يفسّر كياناته كـ HTML بمجرد فكّ ترميزها.

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 الأب - حتى لو كان مُقدَّمًا من نطاقك ذاته.

HTML
<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 أيضًا.

HTML
<a href="https://external.example"
   target="_blank"
   rel="noopener noreferrer">
  View the external resource
</a>
الصفحة المفتوحة تتلقى window.opener === null.

تقيّد سياسة أمان المحتوى (Content Security Policy) مصادر الشفرة القابلة للتنفيذ وتُبطل معظم هجمات XSS، حتى عند نجاح الحقن. وحين تُصرَّح عبر وسم <meta http-equiv>، فإن لها مع ذلك نقاطًا عمياء: التوجيهات frame-ancestors وreport-uri وsandbox تُتجاهل فيه وتتطلب ترويسة HTTP. فضّل الأرقام العشوائية لمرة واحدة (nonces) المُولَّدة من جديد في كل استجابة على قوائم النطاقات المسموح بها، التي يجعلها التوجيه strict-dynamic بائدة على أي حال.

HTML
<meta http-equiv="Content-Security-Policy"
      content="default-src 'self';
               script-src 'self' 'nonce-r4nd0m'">
فقط النصوص البرمجية الحاملة لرقم الخادم العشوائي هي التي تعمل.

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

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. لماذا يُلغي الجمع بين allow-scripts وallow-same-origin على iframe من الأصل ذاته حماية sandbox؟
    • المستند المُضمَّن، القابل للبرمجة وغير المعزول، يمكنه الوصول إلى DOM الأب وإزالة سمة sandbox بنفسه
    • الرمزان غير متوافقين ويتجاهل المتصفح السمة بأكملها
    • allow-same-origin يعطّل تلقائيًا كل الرموز الأخرى
  2. من أي هجوم يحمي rel=noopener؟
    • سرقة كوكيز الجلسة من قبل الصفحة المفتوحة
    • حقن نص برمجي في الصفحة المفتوحة
    • الاستيلاء على التبويب: تستخدم الصفحة المفتوحة window.opener لإعادة توجيه علامة تبويبك إلى موقع تصيّد
  3. أي توجيه يُتجاهَل حين تُصرَّح CSP عبر <meta http-equiv>؟
    • script-src
    • frame-ancestors
    • default-src
    • img-src