محتويات الدورة

JavaScript / متقدم: الجدولة والواجهات الموثوقة / الدرس 17

حدود الثقة الأمنية في JavaScript المتصفح

عامل البيانات الخارجية كغير موثوقة دون خلط التحقق ومعالجة الإخراج والصلاحية. صمّم حدود نص وعنوان آمنة ووضح ما لا تضمنه ضوابط العميل.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تحديد المصادر والتحويلات ومواضع الاستخدام الحساسة.
  • استخدام واجهات النص والعنوان بسياسات صريحة.
  • إبقاء الأسرار والصلاحية خارج ثقة العميل.

قد تصح القيمة كبيانات وتخطر كوسوم

تتبع البيانات من النماذج والعناوين والتخزين والرسائل والاستجابات إلى استخدامها. يفحص التحقق قاعدة المجال وتضبط معالجة الإخراج التفسير في سياق معين. قد يحوي عنوان مشروع أقواساً، فلا يصنع حظر الحروف عشوائياً أمناً كاملاً. فضّل واجهات البيانات واحصر تحليل HTML في عقد وسوم مراجع. لا يصبح النص الآمن آمناً كعنوان أو CSS أو برنامج أو قرار إذن؛ لكل موضع سياسة.

عرض التسميات غير الموثوقة دون تفسير HTML

استخدم textContent للتسمية وابنِ المحيط بواجهات DOM. يحفظ المثال محارف تشبه الوسوم دون أبناء. يوضح موضع نص آمن لا تنقية عامة. يحتاج HTML الغني منقياً مصاناً ملائماً وسماحات محددة؛ ويسهل خطأ الاستبدال اليدوي. تضيف CSP وTrusted Types عند دعمها وضبطها دفاعات لبعض السلوك، لكنها لا تبرر العرض غير الآمن أو تثبت إغلاق كل مسار حقن.

javascript للمتصفح فقط: موضع نص آمن محدد
const label = document.createElement("span");
const externalTitle = "<em>sale</em>";
label.textContent = externalTitle;
console.log(label.textContent);
console.log(label.childElementCount);
الناتج المتوقع
<em>sale</em>
0

تحفظ التسمية حرفياً ولا ينشأ em. وتحتاج سياقات العنوان والوسوم سياسات مختلفة.

تحليل العناوين ثم فرض سياسة سماح

حلل وجهة التحويل أو الرابط بـURL وافحص سياسة صريحة. قد تخدع بادئة نصية بأصل مشابه أو تمثيل غير معتاد. يسمح المثال HTTPS وأصلاً واحداً تماماً ولا يتنقل أو يجلب. أضف قيود المسار عند الحاجة وحدد قبول النسبي على أساس موثوق. لا يصرح الرابط الآمن بالعملية؛ فتحقق من سياسات التحويل والوصول بالخادم أيضاً.

javascript سياسة عنوان محلية بلا طلب أو تنقل
function allowedDestination(input) {
  try {
    const url = new URL(input, "https://learning.example");
    return url.protocol === "https:" && url.origin === "https://learning.example";
  } catch { return false; }
}
console.log(allowedDestination("/courses"));
console.log(allowedDestination("https://other.example/courses"));
console.log(allowedDestination("javascript:alert(1)"));
الناتج المتوقع
true
false
false

يفصل التحليل البروتوكول والأصل قبل المقارنة، ويرفض عنوان javascript التوضيحي ولا ينفذه.

عدم دمج المدخل الاعتباطي في حالة حساسة

قد تحوي الكائنات مفاتيح وبنى غير متوقعة. انسخ المسموح لسجل معروف بدلاً من دمج كل مفتاح تكرارياً في الإعداد. تستحق مفاتيح النموذج والموروث عناية، ولا يحدد فحص الملكية وحده المخطط. تحقق من النوع والحدود والعلاقات. للرسائل بين النوافذ افحص الأصل وعلاقة المرسل ثم البنية. تجنب eval وFunction للتحليل والإعداد؛ فتحليل JSON بيانات لكنه يحتاج تحقق مجال لاحقاً.

ليس سلوك العميل سلطة أمنية

يحسن إخفاء زر أو فحص دور العرض ولا يفرض إذن الخادم؛ إذ يمكن بناء طلب آخر وتغيير التخزين وتجاوز الصفحة. أبقِ التصريح والتحقق الحساس عند الخادم الموثوق ولا تشحن اعتمادات خاصة في JavaScript. يصل البرنامج لتخزين المتصفح وفق نموذجه الأمني، وليس خزنة أسرار. اختبر الدفاع في بيئة مملوكة معزولة بحسابات مصطنعة، وأبلغ عن النطاق والعالق لا ضمان غياب الثغرات من فحص أو أمثلة قليلة.

الأخطاء الشائعة وإصلاحها

افتراض منق واحد لكل موضع

لماذا يحدث؟
الخلط بين سياقات النص والعنوان وHTML والشيفرة.
كيف تصلحه؟
استخدام واجهات وسياسات خاصة بالسياق.
كيف تتجنب تكراره؟
مراجعة تدفق البيانات لكل موضع حساس.

السماح لعنوان ببادئة خام

لماذا يحدث؟
استبدال فحص الأصل المحلل بالمظهر النصي.
كيف تصلحه؟
التحليل بـURL ومقارنة البروتوكول والأصل والمسار.
كيف تتجنب تكراره؟
اختبار النسبي والخارجي والمشوه والبروتوكول الممنوع.

حماية فعل حساس بفحص دور العميل فقط

لماذا يحدث؟
اعتبار العميل القابل للتعديل سلطة موثوقة.
كيف تصلحه؟
فرض الإذن وقواعد الحالة على الخادم.
كيف تتجنب تكراره؟
إدراج اختبارات طلب مباشر في مختبر معزول.

اختبر فهمك

1. هل يعرض عنوان يحوي <em> بأمان دون حذف المحارف؟

اعرض الحل المشروح

نعم، عيّنه إلى textContent وافحص الحرفية وغياب أبناء محللة. إن دعم التنسيق الغني عمداً فهذا عقد مختلف يحتاج تنقية مراجعة؛ فلا تنتقل إلى innerHTML بسبب الأقواس.

2. لا يصل المستخدم لزر مسؤول مخفي. أي دليل أمني ما زال مطلوباً؟

اعرض الحل المشروح

أرسل الفعل في اختبار معزول مصرح كمستخدم مصطنع أقل صلاحية وتوقع رفض الخادم بلا أثر حساس. أدرج حالة مسؤول مسموحة ضابطة. يثبت الغياب العرض فقط لا الإنفاذ الموثوق.

أهم ما تعلمته

  • يعالج التحقق والإخراج الآمن والتصريح أسئلة ثقة مختلفة.
  • افصل سلوك العميل المرئي من الإنفاذ الأمني الموثوق.

المراجع الرسمية