الخلاصة
لا تزال البرمجة النصية عبر المواقع (XSS) واحدة من أكثر ثغرات الويب انتشارًا وخطورة. تعمل أطر الواجهة الأمامية الحديثة، وتطبيقات SPA (تطبيقات الصفحة الواحدة)، والنظم الإيكولوجية الغنية بالبرامج النصية للجهات الخارجية على توسيع كل من الفرص والتعقيد. تدمج هذه المقالة ورقة الغش في الوقاية من البرمجيات الخبيثة XSS من OWASP مع الأبحاث الأكاديمية والصناعية الحديثة، لتشكل استراتيجية دفاعية متعددة الطبقات: الترميز السياقي، وتعقيم HTML، والتتبع الديناميكي لملوثات DOM XSS، والتحليل التفاضلي التفاضلي، وسياسة أمن المحتوى (CSP)، وضوابط سلسلة التوريد. نقترح كذلك تصميمًا ل بنقرة واحدة "فحص XSS" ميزة داخل Penligent، مع خطوط الأنابيب الآلية، وقوالب المسح القابلة لإعادة الاستخدام، وأجهزة وقت التشغيل، وإنشاء التقارير. هذا المستند مناسب للإدراج المباشر في الأوراق البيضاء الهندسية أو وثائق المنتج.

التحفيز
تمكّن ثغرات XSS المهاجمين من حقن نصوص برمجية قابلة للتنفيذ في صفحات ويب حميدة بخلاف ذلك، وتنفذ بشكل فعال في متصفح الضحية تحت امتيازات نطاق الموقع. يمكن أن تؤدي هذه الهجمات إلى استخراج البيانات الحساسة (ملفات تعريف الارتباط، التخزين المحلي)، أو تنفيذ إجراءات غير مصرح بها، أو تشويه المحتوى. (مستندات الويب MDN)
على الرغم من عقود من الوعي وتقنيات التخفيف من المخاطر، إلا أن XSS لا تزال تشكل خطرًا مستمرًا. أدى ظهور العرض من جانب العميل وأطر عمل JavaScript الديناميكية والبرامج النصية للجهات الخارجية وأنظمة النمذجة المعقدة بشكل متزايد إلى صعوبة ضمان صحة البرامج.
أهداف هذا الدليل:
- اجمع بين القواعد العملية الموثوقة لكتاب OWASP Cheat Sheet Sheet الموثوق به مع أحدث الأبحاث الأكاديمية والهندسية.
- تقديم بنية دفاعية قوية ومتعددة الطبقات بدلاً من رصاصة فضية واحدة.
- تقديم تصميم ملموس لـ Penligent لتوفير فحص XSS بنقرة واحدة ميزة الربط بين البحث والمنتج.
الأسس: الترميز السياقي والمصارف الآمنة
أحد المبادئ الأساسية للوقاية من XSS هو: عدم السماح أبدًا بوصول بيانات خام غير موثوق بها إلى سياق قابل للتنفيذ دون ترميز أو تعقيم مناسب. يجب أن يكون الترميز مناسبًا للسياق (نص HTML، أو سمة، أو حرفية JavaScript، أو CSS، أو عنوان URL). هذا هو جوهر ورقة الغش في الوقاية من XSS من OWASP. (cheatsheetsheetseries.owasp.org)
قواعد ترميز المخرجات السياقية
السياق | مثال غير آمن | التشفير الآمن/التخفيف الآمن |
---|---|---|
محتوى نص HTML | <div>$ {مدخل المستخدم}</div> | ترميز كيان HTML (< , & إلخ) |
سمة HTML | <img src="${url}"> | سمة الاقتباس + ترميز السمة؛ التحقق من صحة مخطط URL |
جافا سكريبت حرفيًا | <script>var v = '${userInput}';</script> | الهروب من سلسلة JS (\XXXXXX ، الهروب من علامات الاقتباس/الشرطات الخلفية) |
CSS | <div style="width:${input}px"> | التحقق الصارم من الصحة، أو الهروب من CSS، أو عدم السماح ب CSS الديناميكي |
عنوان URL / HREF | <a href="/hackinglabs/ar/${href}/">انقر فوق</a> | ترميز النسبة المئوية، القائمة البيضاء للمخطط (http/https)، التحويل إلى رمز النسبة المئوية |
في الممارسة العملية، فضّل دائمًا مكتبات الترميز المدمجة أو المختبرة جيدًا. تجنب طرح بدائل مخصصة خاصة بك.
الأحواض الآمنة وتجنب واجهات برمجة التطبيقات الخطرة
حتى مع التشفير الصحيح، فإن بعض واجهات برمجة التطبيقات خطرة بطبيعتها. تتضمن أمثلة على المصارف الخطرة ما يلي:
داخليHTML
,outerHTML
كتابة المستند
,المستند.writeln
eval()
,وظيفة()
المُنشئ- معالجات الأحداث المضمنة (على سبيل المثال
onclick="..."
بمحتوى ديناميكي)
تفضيل البدائل الآمنة:
.textContentent
أوالنص الداخلي
لإدراج النصالعنصر.setAttribute()
(لأسماء السمات المضبوطة)- طرق DOM (على سبيل المثال
إلحاق طفل
,إنشاء عنصر
) بدون تسلسل السلاسل
تعقيم HTML عند الحاجة إلى HTML غني HTML غني
في السيناريوهات التي يُسمح فيها للمحتوى الذي يقدمه المستخدم بتضمين بعض HTML (مثل محرري WYSIWYG والتعليقات ذات الترميز المحدود)، يكون التعقيم ضروريًا. النهج الأساسي هو:
- القائمة البيضاء العلامات والسمات وأنماط قيمة السمات المسموح بها.
- استخدم مكتبات ناضجة (مثل DOMPurify) بدلًا من استخدام معادلات مخصّصة هشّة.
- كن على دراية بما يلي الهجمات التفاضلية التحليلية التفاضلية:: قد يختلف سلوك التحليل الخاص بالمحلل عن محلل HTML الخاص بالمتصفح، مما يؤدي إلى تجاوزات.
هناك خط بحث معروف يوضح كيف يمكن أن تتباين المعالجات والمتصفحات في تفسير ترميزات حالة الزاوية، مما يتيح الهروب عبر الترميز البديل. (راجع بحث "تحليل الفروق التحليليّة")
الكشف عن XSS المستند إلى DOM من خلال تتبع عيب وقت التشغيل
لا يمكن لتقنيات الخادم من جانب الخادم التقاط DOM XSS (الحقن من جانب العميل)، لأن الحوض ذا الصلة قد يكون في JavaScript بعد تحميل الصفحة. التتبع الديناميكي للملوثات (وضع علامات على المصادر غير الموثوق بها ومراقبة الانتشار) هي طريقة مدروسة جيدًا.
- TT-XSS (من تأليف ر. وانغ وآخرين) هو تطبيق كلاسيكي لاكتشاف XSS الديناميكي القائم على DOM. (科学 通通 ↓)
- الحديث عن جيلي يستخدم تحليل التدفق الديناميكي للبيانات لإنشاء ثغرات DOM XSS المستهدفة. (بوابة الأبحاث)
- ترستيمون (2025) يوضح نظام مراقبة عملي لوقت التشغيل يمكنه اكتشاف XSS المستند إلى DOM في تطبيقات العالم الحقيقي بدقة عالية وإيجابيات خاطئة منخفضة. (المكتبة الرقمية ACM)
تقوم هذه الأنظمة بأداة التنفيذ من جانب العميل، وتضع علامة على المدخلات غير الموثوق بها (مثل تجزئة عنوان URL، ومعلمات الاستعلام، وعناصر DOM)، وتكتشف متى تصل إلى مصارف خطيرة (مثل داخليHTML
) بطريقة تؤدي إلى تنفيذ البرنامج النصي.
تحذير واحد: تتبع وقت التشغيل له تكلفة أداء. تجمع بعض الأعمال بين ML/DNN كمرشح مسبق لتقليل النفقات الزائدة لتتبع التلوث. على سبيل المثال، يقترح ميليتشر وآخرون استخدام التعلّم العميق للتصنيف المسبق للوظائف الضعيفة المحتملة وتطبيق تتبع التلوث هناك فقط. (contrib.andrew.cmu.edu)
المثال أ - ثابت (استخدام الحوض الآمن محتوى النص
)
<html>
<head><title>Welcome</title></head>
<body>
<h1>مرحباً!</h1>
<div id="greeting"></div>
<script>
function getQueryParam(name) {
return new URLSearchParams(window.location.search).get(name);
}
var raw = getQueryParam("name") || "";
// Use textContent to insert as plain text (safe)
document.getElementById("greeting").textContent = raw;
</script>
<p>مرحباً بك في موقعنا.</p>
</body>
</html>
لماذا هذا آمن: محتوى النص
يكتب نصًا عاديًا؛ حتى لو الخام
يحتوي على ...
فسيتم عرضه كنص، ولن يتم تنفيذه. أيضا باستخدام URLSearchParams
يتجنب التحليل الهش للفهرس/السلسلة الفرعية. portswigger.net

المثال ب - بالوعة السمات ومعالجة آمنة لعناوين URL (بالوعة زائفة للمعرف)
النمط الضعيف:
// ضعيف:
var params = جديد URLSearchParams(window.location.search);
متغير الهدف = params.get("url")؛ // يتحكم فيه المستخدم
document.getElementById("mylink").href = target;
إذا كان الهدف
هو رمز جافا سكريبت، يؤدي النقر على الرابط إلى تنفيذ JS.
النمط الآمن (التحقق من صحة المخطط):
function safeHref(input) {
try {
var u = new URL(input, window.location.origin);
if (u.protocol === "http:" || u.protocol === "https:") {
return u.toString();
}
} catch(e) { /* invalid URL */ }
return "#";
}
document.getElementById("mylink").href = safeHref(params.get("url"));
الشرح: عنوان URL جديد()
التطبيع؛ فنحن نسمح فقط بـ http:
/https
المخططات. هذه الكتل جافا سكريبت:
/البيانات:
المخططات. portswigger.net
سياسة أمان المحتوى (CSP): الدفاع في العمق
في حين أن التشفير والتعقيم هما الدفاعان الأساسيان، يوفر نظام حماية الشفرات حاجز ثانوي قوي. إن نظام CSP جيد التكوين باستخدام النون أو التجزئة، إلى جانب ديناميكية صارمة
وإزالة 'غير آمن-مضمنة'
يمكن أن يحد بشكل كبير من استغلال XSS.
ومع ذلك، توجد بعض المزالق:
- إعادة استخدام nonce: تقوم بعض المواقع بإعادة استخدام نفس النونce عبر استجابات متعددة، مما يقوض حماية CSP. تُظهر دراسة حديثة بعنوان "Nonce-nce لأمن الويب" أن العديد من المواقع في العالم الحقيقي تفعل ذلك. (arXiv)
- تعقيد النشر: غالبًا ما يؤدي دعم البرامج النصية المضمنة القديمة والمكتبات الخارجية وتناقضات المتصفح إلى تخفيف السياسات.
وبالتالي، يجب أن يكون الترميز والتعقيم CSP مكملاً للتشفير والتعقيم وليس بديلاً عنهما.
أفضل الممارسات الهندسية: التثبيت، والاختبار، والاختبار، والمراقبة
لتفعيل دفاعات XSS القوية:
- ESLint / كودات الكودات:: حظر أو الإبلاغ عن استخدام المصارف غير المسموح بها (innerHTML، eval)، تتطلب شروحًا للسياق على تعبيرات القالب.
- التحليل الثابت والديناميكي في CI:
- تحليل التلوث الثابت متعدد الملفات لوحدات JS النمطية
- اختبار الغموض أو اختبارات التحليل التفاضلي أو اختبارات التحليل التفاضلي
- أجهزة وقت التشغيل في البيئات المرحلية
- اختبارات الوحدة/الأمان:: إنشاء حمولات مستندة إلى السياق في اختبارات الوحدة لضمان تطبيق الترميز الصحيح (كما هو الحال في "الكشف الآلي عن ثغرات XSS وإصلاحها" أو "اكتشاف XSS عبر اختبار الوحدة") (arXiv)
- المراقبة والتنبيه:: جمع تقارير انتهاكات CSP، وتنبيهات وقت التشغيل المجهزة بأدوات للتدفقات المشبوهة، ومقاييس سجلات فشل الترميز.

تصميم فحص XSS بنقرة واحدة بنقرة واحدة بنقرة واحدة
فيما يلي مواصفات التصميم المقترحة التي يمكنك تضمينها في منتج Penligent على أنها مسح XSS بنقرة واحدة "Playbook" بنقرة واحدة.
سير عمل المهام (رفيع المستوى)
- عرض الزحف و JS - اكتشف جميع الصفحات والطرق التي تعتمد على JS.
- التحليل الثابت - انتشار التلوث على التعليمات البرمجية المصدرية لتحديد مواقع البواليع والدوال عالية الخطورة.
- مسح القالب - استخدام الماسحات الضوئية النموذجية (مثل Nuclei) لإطلاق حمولات XSS الشائعة.
- وقت التشغيل/الفحص الديناميكي - باستخدام التصفح بدون رأس والأجهزة، وحقن الحمولات واكتشاف تنفيذ البرامج النصية.
- تتبع التلوث وقت التشغيل - صك وقت تشغيل الصفحة ومراقبة ما إذا كانت البيانات غير الموثوق بها تصل إلى المصارف الخطرة.
- اختبار الغموض التفاضل التحليلي التفاضلي - قم بتغذية ترميز حالة الحافة إلى المطهر + المتصفح واكتشف الاختلافات.
- التدقيق في نظام حماية من الشمس الحارقة ومراجعة حساباته - فحص الرؤوس، وعلامات النص البرمجيات، والتحقق من عدم إعادة استخدام غير الآمن، وسمات التكامل المفقودة.
- إعداد التقارير - قم بتجميع الثغرات الأمنية مع نقاط الضعف مع نقاط إثبات الأداء وتصنيف المخاطر واقتراحات العلاج، وإنشاء تصحيحات العلاقات العامة اختياريًا.
نموذج قالب النواة (XSS المنعكس)
المعرف: xss-reflect-basic
معلومات:
الاسم: انعكاس XSS الأساسي
المؤلف: penligent-scan
الخطورة: عالية
الطلبات:
- الطريقة: GET
المسار:
- "{{BaseURL}}?q={{payload}}"
الحمولة:
الحمولة:
- "<تنبيه(1)سكريبت>"
المصفوفات:
- النوع: كلمة
الجزء: الجسم
الكلمات:
- "تنبيه(1)سكريبت>"
يمكنك التوسع مع مجموعات الحمولة المدركة للسياق (السمة، JS، URL) والتسلسل إلى التحقق بدون رأس لتقليل الإيجابيات الخاطئة.
نموذج تعريف المهمة (JSON)
{
"name": "XSS QuickScan",
"الخطوات": [
{"id": "الزحف"، "النوع": "زاحف"، "بارامز": {"start_url": "{{الهدف}}"، "render_js": صحيح}},
{"id": "ثابت"، "النوع": "static_analysis", "deps": ["زحف"]، "بارامز": {"المحللون": ["multi-file-taint"]}},
{"id": "template_scan"، "النوع": "ماسح ضوئي"، "ديبز": ["زحف"]، "بارامز": {"القوالب": ["xss-reflect-basic"]}},
{"id": "ديناميكي"، "النوع": "Dynamic_scan", "deps": ["template_scan", "static"]، "params": {"المحرك": "headless-instrumented"}},
{"id": "dom_taint"، "type": "runtime_taint"، "deps": ["ديناميكي"]، "بارامز": {"وكيل": "متصفح مفعل"}},
{"id": "parsing_diff", "type": "تحليل_diff"، "deps": ["ديناميكي"]، "بارامز": {}},
{"id": "audit_csp"، "النوع": "csp_audit", "deps": ["زحف"]، "بارامز": {}},
{"id": "تقرير"، "النوع": "report_gen", "deps": ["dom_taint", "تحليل_diff", "audit_csp"]، "params": {"format": "pdf,html"}}}}
]
}
التقرير والمخرجات
تتضمن كل نتيجة:
- النوع (منعكس / مخزن / مخزن / DOM)
- إثبات المفهوم (طلب/استجابة HTTP، لقطة DOM، لقطة شاشة)
- درجة الخطورة
- إصلاح الاقتراحات (مثل التشفير الصحيح، وتهيئة المعقم، والاستخدام الآمن لواجهة برمجة التطبيقات)
- الإنشاء التلقائي الاختياري للهيكل العظمي للتصحيح أو العلاقات العامة
يمكنك أيضًا الارتباط بالأدبيات ذات الصلة (على سبيل المثال الاستشهاد بـ TrustyMon، تحليل الأوراق التفاضلية) في التقرير الفني الداخلي.
نماذج مقتطفات التعليمات البرمجية وأفضل الممارسات
فيما يلي بعض المقتطفات التوضيحية الآمنة/غير الآمنة في إعدادات تشبه React:
غير آمن (عرضة للخطر)
دالة تهنئة المستخدم(الدعائم) { إرجاع ; }إصدار أكثر أماناً
استورد DOMPurify من 'dompurify';
دالة UserGreeting(props) {
const clean = DOMPurify.sanitize.sanitize(props.userContent, { ALLOWED_TAGS: ['b','i','u','a']، ALLOWED_ATTR: ['href']}));
إرجاع <div dangerouslysetinnerhtml="{{" __html: clean }} />;
}
أو أفضل من ذلك:
دالة تهنئة المستخدم(الدعائم) {
إرجاع <div>{props.userContentent}</div>؛ // سوف تقوم React بالهروب التلقائي
}
بالنسبة لقيم السمات:
// Unsafe
<img src={userInput} />
// Safer
function safeUrl(u) {
const doc = new URL(u, window.location.origin);
if (doc.protocol === 'http:' || doc.protocol === 'https:') {
return doc.toString();
}
return '/'; // fallback
}
<img src={safeUrl(userInput)} />
الخاتمة والخطوات التالية
تدمج هذه المقالة بين ورقة الغش في الوقاية من XSS من OWASP (القواعد العملية) مع الاتجاهات البحثية الحديثة (تلويث وقت التشغيل، والتحليل التفاضلي، والتصفية المسبقة للتعلم الآلي) لصياغة نهج دفاعي قوي وملائم للهندسة. يساعد تصميم الفحص بنقرة واحدة من Penligent على إنتاج هذه الأساليب - مما يسهل على الفرق اعتماد دفاعات قوية دون إعادة اختراع خطوط الأنابيب.