الوكيل الاعتراضي
الوكيل الاعتراضي (Intercepting Proxy) أداة تقع بين متصفحك وخادم الويب وتُظهر لك كل طلب (request) واستجابة (response) في HTTP أثناء مروره: الطريقة والعنوان (URL) والترويسات وملفات تعريف الارتباط (cookies) والمتن، لا الصفحة النهائية فقط. والمثال في هذا الدرس هو ZAP (Zed Attack Proxy)، الوكيل المجاني مفتوح المصدر المعروف طويلاً باسم OWASP ZAP؛ وتعمل أدوات الوكيل الاعتراضي الأخرى بالطريقة نفسها بأسماء قوائم مختلفة.
ولأن حركة المرور تمرّ عبره، يستطيع الوكيل الاحتفاظ بسجلّ قابل للبحث لكل رسالة، وإيقاف الطلب (اعتراضه) كي تغيّره قبل أن يصل إلى الخادم، وإعادة تشغيل طلب سابق بقيم مختلفة. ويستعمل المختبِر ذلك ليرى ما يفعله الخادم حين يرسل العميل شيئاً لا يرسله التطبيق الحقيقي أبداً، مثل معرّف طلب شراء يخصّ مستخدماً آخر، أو دور أعلى، أو طلب بلا جلسة على الإطلاق.
لماذا يهم
كثير من عيوب الويب الخطيرة يكمن فيما يثق به الخادم. فإذا افترض الخادم أن المتصفح لن يرسل إلا معرّفات طلبات شراء تخصّ المستخدم المسجَّل دخوله، فإن تغيير ذلك المعرّف في الوكيل قد يكشف خلال دقائق خلل التحكم في الوصول (Broken Access Control)، وهو الفئة A01 في OWASP Top 10:2025 التي عرفتها في الدرس السابق. أما الزرّ المعطَّل والحقل المخفي والتحقق في جانب العميل فهي مجرد اقتراحات للمتصفح؛ والوكيل يتيح لك اختبار الخادم، وهناك يجب أن يصمد الأمان.
وبالنسبة إلى المختبِر، يحوّل الوكيل القلق الغامض إلى دليل قابل للتكرار: الطلب بالضبط، والقيمة الواحدة التي غيّرتها، والاستجابة. وهذا تقرير خطأ يستطيع المطور التصرّف بناءً عليه، والسجل يُظهر ما أرسلته بالضبط، فتستطيع أن تبيّن أن الاختبار المُصرَّح به بقي داخل حدوده.
أين يقع الوكيل، وكيف تهيّئه بأمان
يستمع الوكيل على عنوان محلي، مثل 127.0.0.1:8080. تُوجّه المتصفح إليه، فيصبح كل طلب يسير من المتصفح إلى الوكيل إلى الخادم، وتعود كل استجابة بالطريقة نفسها. وبخلاف لوحة الشبكة (Network) في أدوات المطوّر، التي تسجّل ما فعله تبويب واحد، يقف الوكيل في مسار الرسالة ويستطيع إيقافها قبل أن يراها الخادم.
خطوتان في التهيئة تحفظان الأمان. أولاً، استعمل ملف تعريف متصفح مخصّصاً للاختبار (profile)، أو متصفحاً منفصلاً، يرسل حركة مروره إلى الوكيل، حتى لا تمرّ عبره عمليات تسجيل دخولك المعتادة وملفات تعريف الارتباط لديك. ثانياً، لقراءة HTTPS يُنهي الوكيل الاتصال المشفّر للمتصفح بنفسه ويقدّم لكل موقع شهادة توقّعها جهة إصدار شهادات (CA) خاصة به. ثِق بشهادة جهة الإصدار هذه في ملف الاختبار وحده، لا على مستوى النظام ولا على جهاز شخصي أبداً، لأن المتصفح الذي يثق بها يقبل أي شهادة موقَّعة بمفتاحها لأي موقع. وأزِلها عند انتهاء المهمة.
- 1متصفح الاختباركل حركة المرور ← الوكيلملف تعريف مخصّص يثق بشهادة جهة الإصدار (CA) الخاصة بالوكيل
- 2فحص النطاقهل هذا المضيف ضمن القائمة المُصرَّح بها؟الوكيل
فرع: خارج النطاق ← يمرّ دون تغيير: لا يُعترض ولا يُعاد تشغيله ولا يُفحصتنبيه
بوابة: داخل النطاق فقط
- 3السجلسجلّ قابل للبحث لكل طلب واستجابة؛ يقرؤه الفحص السلبيالوكيل
- 4اعتراض وتعديلأوقفه وغيّر قيمة واحدة: معرّفاً أو دوراً أو جلسة
GET /api/orders/1043اختياري - 5الهدف المُصرَّح بهيستجيب، وتعود الاستجابة عبر الوكيل إلى السجل
طوال الخطوات 3–5 داخل النطاق المُصرَّح به · الإذن الكتابي يسمّي هذه المضيفات
عودة إلى الخطوة 3 إعادة التشغيل: أعد الإرسال من السجل بقيمة واحدة مغيَّرة
السجل، والاعتراض والتعديل، وإعادة التشغيل
يسرد السجل (تبويب History في ZAP؛ وتسمّيه أدوات أخرى HTTP history) كل طلب واستجابة، مع مرشّحات مثل الطريقة ورمز الحالة ونمط عنوان (URL) يطابق مضيفاً واحداً، لتجد الاستدعاء الذي تحتاجه بين المئات. والاعتراض والتعديل (Intercept and Modify) يوقف الطلب عند الوكيل: فتُحرّر ترويسةً أو معاملاً أو المتن، ثم تدعه يُكمِل، فيتلقّى الخادم نسختك لا نسخة المتصفح.
وإعادة التشغيل (Replay) ترسل طلباً من السجل مجدداً بقيمة واحدة مغيَّرة لتقارن الاستجابات؛ وفي ZAP تنقر عليه بالزر الأيمن وتختار «Open/Resend with Request Editor». وإعادة التشغيل تحوّل «الزرّ معطَّل» إلى حقيقة عن الخادم. وتغطي ثلاث إعادات تشغيل معظم الفحوص الأولى:
- معرّف مغيَّر: أبقِ جلستك واطلب طلب شراء أو ملفاً شخصياً يخصّ مستخدماً آخر. يجب أن يرفض الخادم.
- دور مغيَّر: أعد إرسال طلب لا يجوز إلا للمسؤول (admin) بجلسة مستخدم عادي، أو غيّر حقل
roleمنuserإلىadminعند تحديث حساب الاختبار الخاص بك. يجب أن يرفض الخادم التغيير أو يتجاهله. - قيمة جلسة مغيَّرة: احذف ملف تعريف ارتباط الجلسة، أو أعد استعمال واحد من جلسة سجّلت الخروج منها. يجب أن يجيب الخادم بـ
401 Unauthorizedأو يوجّهك إلى تسجيل الدخول، لا أن يعيد البيانات أبداً.
الفحص السلبي: دليل أولي لا حُكم
أثناء مرور حركة المرور عبره، يستطيع الوكيل فحص كل رسالة وإطلاق تنبيهات دون أن يرسل شيئاً من عنده. هذا هو الفحص السلبي (Passive Scanning)، ولأنه لا يقرأ إلا حركة مرور كنت تتبادلها أصلاً، فإبقاؤه عاملاً أثناء الاختبار المعتاد آمن.
والتنبيه دليل أولي لا حُكم: فقد يكون إيجابياً كاذباً (false positive)، ويفوت الفحص السلبي كل ما يحتاج إلى طلب لم يصنعه التطبيق. أكّد كل تنبيه يدوياً قبل الإبلاغ عنه. أما الفحص النشط (Active Scanning)، حيث ترسل الأداة طلبات هجوم مُصاغة من عندها، فهو وضع منفصل أكثر خطراً يحتاج إلى إذن صريح، وهو خارج هذا الدرس.
- ترويسة غائبة: استجابة بلا
Strict-Transport-SecurityأوContent-Security-Policy. - ملف تعريف ارتباط ضعيف: ملف جلسة يُضبط بلا السمة
SecureأوHttpOnly(RFC 6265). - تسريب: رمز (token) في سلسلة الاستعلام (query string) لعنوان URL، أو صفحة خطأ تعرض أثر المكدس (stack trace).
جرّبها: محلّل ترويسات الأمان جرّبها: محلّل ملفات تعريف الارتباط (Cookies)
مثال تطبيقي: فحص التحكم في الوصول بإعادة التشغيل
أنت مُصرَّح لك كتابياً باختبار المتجر في بيئة الاختبار التجريبية (staging) لفريقك، وstaging.shop.example داخل نطاق الوكيل. بعد تسجيل الدخول بمستخدم الاختبار الخاص بك، تفتح أحد طلبات الشراء الخاصة بك وتجد طلب HTTP الخاص به في السجل. وفي محرّر الطلبات تغيّر معرّف طلب الشراء وحده إلى معرّف يملكه مستخدم اختبار ثانٍ، وتُبقي ملف تعريف ارتباط جلستك، ثم تعيد الإرسال.
النتيجة الآمنة هي 403 Forbidden أو 404 Not Found: فالخادم يتحقق من أن طلب الشراء يخصّ المستدعي. أما 200 OK مع طلب شراء المستخدم الآخر فهي خلل في التحكم في الوصول، أي مرجع كائن مباشر غير آمن (IDOR)، ولديك بالفعل الطلب والاستجابة بالضبط لتقرير الخطأ.
GET /api/orders/1042 HTTP/1.1
Host: staging.shop.example
Cookie: session=<your own test session>
# Replay with one change: an order id that is not yours
GET /api/orders/1043 HTTP/1.1
Host: staging.shop.example
Cookie: session=<your own test session>
# Secure response: 403 Forbidden or 404 Not Found
# Broken access control: 200 OK with another user's orderأخطاء شائعة
- الاختبار عبر ملف متصفحك اليومي، فتصل تسجيلات دخولك الشخصية وملفات تعريف الارتباط إلى ما يلتقطه الوكيل وإلى لقطات الشاشة.
- الوثوق بشهادة جهة الإصدار (CA) الخاصة بالوكيل على مستوى النظام أو على جهاز شخصي، ثم نسيان إزالتها.
- اعتبار الزرّ المعطَّل أو التحقق في جانب العميل دليلاً على وجود ضابط أمني، بدل إعادة تشغيل الطلب على الخادم.
- ترك النطاق مفتوحاً، فتصل إعادة التشغيل أو الفحص إلى مضيفات لا إذن لك باختبارها.
- الإبلاغ عن تنبيه من الفحص السلبي بوصفه عيباً مؤكَّداً دون التحقق منه يدوياً.
- تغيير قيمتين معاً، أو عدم حفظ الطلب والاستجابة بالضبط، فلا يعرف أحد ما الذي سبّب النتيجة.
من منظور ضمان الجودة
في الفريق، الوكيل الاعتراضي أداة المختبِر الوظيفي بقدر ما هو أداة المختصّ. فتستعمله في اختبار الميزات المعتاد لترى الطلبات خلف مسارٍ ما، ولتعيد إنتاج خطأ بالضبط، ولتُجري الفحوص القليلة للتحكم في الوصول التي تستحقّها كل ميزة تتطلب تسجيل دخول: هل أصل إلى سجلّ مستخدم آخر، هل أتصرّف فوق دوري، هل يتحقق الخادم من الجلسة في كل طلب. أما الاختبار الأعمق والنشط فهو من شأن مختصّي الأمان ودليل OWASP لاختبار أمان الويب (Web Security Testing Guide).
اتفق أولاً على النطاق والإذن مع مالك البيئة، وفضّل بيئة الاختبار التجريبية على بيئة الإنتاج، ولا تستعمل إلا حسابات الاختبار التي أُعطيت لك. وفي تقرير الخطأ، أدرِج الطلب والاستجابة مع إخفاء الأسرار، والقيمة الواحدة التي غيّرتها، والسلوك الآمن المتوقَّع، كي يستطيع المطور تأكيد الإصلاح بإعادة التشغيل نفسها.
تمرين عملي
خطّط لفحص الدور وفحص الجلسة بإعادة التشغيل
أنت مُصرَّح لك كتابياً باختبار المتجر في بيئة الاختبار التجريبية لفريقك، ومضيفه داخل نطاق الوكيل. تعرض المادة طلباً التُقِط حين فتح مستخدم الاختبار المسؤول (admin) قائمة المستخدمين، وملف تعريف ارتباط جلسة مستخدم الاختبار العميل.
خطّط لإعادتَي تشغيل: واحدة تختبر فحص الدور وأخرى تختبر فحص الجلسة. اذكر لكل منهما ما تغيّره وما تُبقيه والاستجابة الآمنة المتوقَّعة، ثم اذكر ما تتأكّد منه قبل الإرسال.
# Captured as your admin test user
GET /api/admin/users HTTP/1.1
Host: staging.shop.example
Cookie: session=a91e... (admin test user)
Accept: application/json
# Session cookie of your customer test user
Cookie: session=7c03...- جِد القيمة التي تُخبر الخادم بهوية المستدعي.
- خطّط لإعادة تشغيل الدور: ما تستبدله وما يبقى كما التُقِط.
- خطّط لإعادة تشغيل الجلسة: ما تحذفه وما يبقى كما التُقِط.
- اذكر ما تتأكّد منه قبل إرسال أي شيء.
إظهار الإجابة النموذجية
تغيّر إعادتا التشغيل ملف تعريف ارتباط session وحده: فهو القيمة الوحيدة هنا التي تُخبر الخادم بهوية المستدعي، والخادم يستنتج المستخدم ودوره من تلك الجلسة. وتبقى الطريقة والمسار والترويسات الأخرى كما التُقِطت بالضبط، فيكون أي تغيّر في الاستجابة ناتجاً عن تلك القيمة الواحدة.
إعادة تشغيل الدور: استبدل a91e... بجلسة العميل 7c03... وأعد الإرسال. الآمن: 403 Forbidden، أو 404 Not Found إن كان التطبيق يخفي مسارات المسؤول. أما 200 OK مع قائمة المستخدمين فتعني أن العميل يستطيع التصرّف بوصفه مسؤولاً، وهذا خلل في التحكم في الوصول.
إعادة تشغيل الجلسة: احذف ترويسة Cookie وأعد الإرسال. الآمن: 401 Unauthorized أو إعادة توجيه إلى صفحة تسجيل الدخول. أما 200 OK مع بيانات فتعني أن نقطة النهاية لا تتحقق من المصادقة (authentication) أصلاً.
قبل الإرسال، تأكّد أن المضيف داخل نطاق الوكيل، وأن إذنك الكتابي يشمل هذا المضيف وهذا التاريخ وهذا النوع من الفحص، وأن الحسابين حسابا اختبار أُعطيا لك. والبدء بـGET يساعد: فالمعيار RFC 9110 يعرّفه طريقةً آمنة (safe method)، فلا ينبغي أن تغيّر إعادة تشغيله البيانات. وإن كان أي شيء غير واضح، فتوقّف واسأل.
أسئلة شائعة
هل الوكيل الاعتراضي هو نفسه أدوات مطوّري المتصفح؟
بينهما تداخل. فلوحة الشبكة في أدوات المطوّر تُظهر طلبات التبويب وتتيح نسخ بعضها أو إعادة إرساله، وهذا يكفي لكثير من الفحوص. أما الوكيل فيضيف خطوة اعتراض حقيقية توقف الطلب قبل أن يصل إلى الخادم، وسجلاً واحداً عبر التبويبات والعملاء، وفحصاً سلبياً، ويلتقط عملاء غير متصفحين مثل تطبيق جوال أو curl. ابدأ بأدوات المطوّر، والجأ إلى الوكيل حين تحتاج إلى تغيير طلب في أثناء مروره أو إلى التقاط أكثر من عميل.
لماذا عليّ تثبيت شهادة؟
يشفّر HTTPS حركة المرور بين المتصفح والخادم، فكي يقرأها الوكيل ويعدّلها يُنهي اتصال المتصفح بنفسه ويقدّم شهادة توقّعها جهة إصدار الشهادات (CA) الخاصة به. ولا يقبل متصفح الاختبار ذلك إلا إذا وثق بشهادة جهة الإصدار هذه. ثبّتها في ملف اختبار مخصّص، لا على مستوى النظام ولا على جهاز شخصي أبداً، وأزِلها عند الانتهاء.
هل أستطيع استعمال وكيل على أي موقع أريد اختباره؟
لا. استعمله فقط على الأنظمة التي تملكها أو لديك إذن كتابي صريح باختبارها. فالوكيل يرسل طلبات حقيقية معدَّلة إلى خادم حقيقي، وفعل ذلك دون إذن ليس اختباراً وهو مخالف للقانون في دول كثيرة. اضبط نطاق الوكيل على المضيفات المُصرَّح بها واترك كل ما عداها خارجه.
ما الفرق بين الفحص السلبي والنشط؟
الفحص السلبي لا يقرأ إلا حركة المرور التي كنت ترسلها وتستقبلها أصلاً، فيمكن إبقاؤه عاملاً بأمان. أما الفحص النشط فيرسل طلبات مُصاغة من عنده ليستكشف نقاط الضعف؛ وهو أكثر خطراً وقد يغيّر البيانات ويحتاج إلى إذن صريح. ويبقى هذا الدرس مع الفحص السلبي والفحوص اليدوية بطلب واحد في كل مرة.
المراجع
- OWASP Web Security Testing Guide (WSTG)المنهجية المرجعية لاختبار تطبيقات الويب وواجهات API بحثاً عن نقاط الضعف الأمنية، اختباراً تلو الآخر.
- NIST SP 800-115: Technical Guide to Information Security Testing and Assessmentكيف تُخطَّط تقييمات الأمان وتُنفَّذ: المراجعة وتحديد الأهداف والتحقق من الثغرات وإعداد التقارير.
- OWASP Top 10:2025أخطر عشرة مخاطر أمنية لتطبيقات الويب، مع كيفية اختبار كل منها والوقاية منه.
- RFC 9110: HTTP Semanticsمعاني أساليب HTTP وحقول الترويسات ورموز الحالة والتفاوض على المحتوى، بغضّ النظر عن إصدار البروتوكول.
تدرّب بأدوات متقن
أنشئ طلبات HTTP وأرسلها (الطريقة وعنوان URL والترويسات والمصادقة والجسم) وافحص الاستجابة — بديل خفيف لـ Postman داخل متصفحك.
اختبر مصادقة Bearer وBasic ومفتاح API والترويسات المخصّصة على نقطة نهاية وقارن الاستجابات المصرّح بها بغير المصرّح بها.
تحليل ترويسات طلبات واستجابات HTTP الخام إلى جدول منظّم مع الشروحات.
تحليل ترويسات Set-Cookie والتحقق من أفضل الممارسات في Secure وHttpOnly وSameSite وDomain وPath وانتهاء الصلاحية والحجم.
تقييم ترويسات أمان HTTP (CSP وHSTS وX-Frame-Options وReferrer-Policy وPermissions-Policy وCOOP/CORP) من ترويسات ملصقة أو عنوان URL عام.
اطّلع بالضبط على ما يرسله عميلك: الطريقة والترويسات والاستعلام والجسم وعنوان IP ومعلومات TLS.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.