اختبار الحقن
الحقن (Injection) عيب أمني يَعبُر فيه مدخل غير موثوق إلى موضع يفسّره — استعلام SQL أو أمر لنظام التشغيل أو مرشّح LDAP أو تعبير XPath أو قالب — فيُنفَّذ جزء من المدخل بوصفه شيفرة بدلاً من معاملته كبيانات. والمثال التقليدي حقل تسجيل دخول تُدمَج قيمته مباشرةً في استعلام SQL: فقيمة مثل ' OR '1'='1 تكفّ عن كونها بريداً إلكترونياً وتصير جزءاً من منطق الاستعلام.
واختبار الحقن هو فحص ما إذا كانت المدخلات التي تصل إلى مفسّر مفصولةً عن الشيفرة المحيطة بها، على نظام تملكه أو لديك إذن مكتوب باختباره. ترسل مدخلات مختارة بعناية وغير مُدمِّرة وتراقب كيف يستجيب النظام. يتناول هذا الدرس المفسّرات في جانب الخادم؛ أما الحقن في المتصفح (البرمجة النصية عبر المواقع، XSS) فهو موضوع الدرس التالي.
لماذا يهم
بقي الحقن سنواتٍ ضمن قائمة OWASP Top 10 لأبرز مخاطر أمان تطبيقات الويب، لأن الوقوع في الخطأ سهل وعواقبه وخيمة: فاستعلام واحد لا يستخدم المعاملات قد يكشف كل صفوف جدول، أو يسمح بتجاوز تسجيل الدخول، أو يُفسد البيانات. والعيب غير مرئي في الاستخدام العادي — إذ تعمل الميزة تماماً مع المدخلات المعتادة — فيبقى حتى يرسل أحدهم مدخلاً لم يتوقعه المطوّر.
وبالنسبة إلى المختبِر، الحقن عمل عالي القيمة. فالفحوص زهيدة الكلفة، وتتبع نمطاً قابلاً للتكرار عبر كل مدخل يصل إلى مفسّر، والنتيجة المؤكَّدة تُصلَح سريعاً في الغالب لأن العلاج معروف جيداً. والعثور على موضع حقن واحد قبل الإصدار أرخص بكثير من اختراق في بيئة الإنتاج.
أين يحدث الحقن
لكل حقن الشكل نفسه: تُدمَج بيانات المستخدم مع أمرٍ لمفسّر ما، ولا يستطيع المفسّر أن يميّز أي جزء كان المقصود به أن يكون بيانات. وحيثما يبني التطبيق أمراً من نص يوجد موضع محتمل — ولا يلزم أن يكون المفسّر قاعدة بيانات.
- حقن SQL: يصل المدخل إلى استعلام قاعدة بيانات. وعلامة الاقتباس المفردة
'رمز خاص (Metacharacter)، أي حرف له معنى خاص لدى المفسّر، وهو هنا نهاية القيمة النصية؛ وغالباً ما تُثير خطأ قاعدة بيانات، وهو أول إشارة إلى أن المدخل يُحلَّل بوصفه SQL. - حقن أوامر نظام التشغيل: يصل المدخل إلى أمر صدفة (Shell)، مثل اسم ملف يُدرجه التطبيق في أمر يشغّله. ويمكن لرموز الصدفة الخاصة مثل
;و|و&أن تغيّر ما يُنفَّذ. - حقن LDAP وXPath وNoSQL: يصل المدخل إلى مرشّح دليل أو استعلام XML أو استعلام قاعدة بيانات مستندية، ولكلٍّ صياغته ورموزه الخاصة.
- حقن القوالب في جانب الخادم (Server-side template injection): يصل المدخل إلى محرّك قوالب يُقيّم التعابير، فقد يتحوّل اسمٌ في الملف الشخصي إلى شيفرة تُنفَّذ.
- الوصول أهم من اسم الحقل: فقيمة من رابط أو ترويسة أو ملف تعريف ارتباط أو ملف مرفوع قد تنتقل إلى مفسّر تماماً كما ينتقل حقل نموذج.
الاختبار بأمان
اختبر فقط الأنظمة التي تملكها أو لديك إذن مكتوب باختبارها، وفضّل أخفّ مدخل يجيب عن السؤال. فالهدف معرفة ما إذا كان المدخل يُحلَّل بوصفه شيفرة، لا إحداث ضرر، لذا لا تستخدم أبداً حمولات (Payloads) تحذف البيانات أو تغيّرها أو تقرؤها.
وأكثر الفحوص الأولية أماناً رمزٌ خاص واحد بمفرده. فإذا أنتجت ' خطأ قاعدة بيانات أو تتبّع مكدّس (Stack trace) أو نتيجة متغيّرة بينما لا تفعل ذلك قيمة عادية، فالمدخل يصل إلى المفسّر دون حماية — وهذا يكفي لتسجيل عيب. ثم تؤكّد ذلك بمقارنة واحدة غير ضارة ولا تتجاوزها: علامتا اقتباس ''، وهما في SQL علامة اقتباس حرفية واحدة داخل القيمة النصية، ينبغي أن تُخفيا الخطأ؛ أو قيمة عادية يُضاف إليها بـAND شرط صحيح دائماً فتُعيد النتيجة المعتادة، بينما تُعيد القيمة نفسها مع شرط خاطئ دائماً لا شيء.
- استخدم الرموز الخاصة إشاراتٍ:
'و"و;و--لـSQL؛ و;و|و&للصدفات؛ و*و(و)لـLDAP. - راقب الفرق: خطأ قاعدة بيانات أو استجابة متغيّرة أو تأخّر أطول أو عدد صفوف مختلف بين مدخل عادي وآخر مُعَدّ خصيصاً هو الدليل.
- اختبر كل قناة، بما في ذلك المدخلات التي تخفيها الواجهة، لأن التحقق على الشاشة لا يحمي الخادم.
- لا تُشغّل أبداً سلاسل استغلال مُدمِّرة أو قارئة للبيانات؛ توقّف عند إثبات أن المدخل يُفسَّر.
جرّبها: مولّد مجموعات الأحرف الخاصة جرّبها: مولّد الاختبارات السلبية
مثال تطبيقي: الحل هو الاستعلامات ذات المعاملات
تأمّل بحثاً عن عميل يجد المستخدمين بالبريد الإلكتروني. النسخة القابلة للحقن تبني الاستعلام بدمج النصوص، فيقع المدخل داخل نص SQL. والحل استعلام ذو معاملات (Parameterised query)، ويُسمّى أيضاً عبارة مُعدّة مسبقاً (Prepared statement): يكون نص الاستعلام ثابتاً ويُرسَل المدخل إلى قاعدة البيانات منفصلاً، كقيمة لا يمكنها أبداً تغيير بنية الاستعلام.
والتحقق من المدخلات وتهريبها (Escaping) يساعدان، لكنهما ليسا الحل للحقن: فالحل هو سطر SQL في جدول سياقات الإخراج في الدرس السابق، أي الاستعلام ذو المعاملات. فالبيانات الصالحة تحتوي رموزاً خاصة بحق: فاسم العائلة O'Brien فيه فاصلة عليا، فلا يستطيع التحقق رفضها. أما تهريب هذه الرموز فليس إلا ملاذاً أخيراً في المفسّرات التي يتناولها هذا الدرس في جانب الخادم: فلكل مفسّر رموزه الخاصة، ورمز واحد يُغفَل يعيد فتح الثغرة. وفصل البيانات عن الشيفرة بتمرير القيم معاملاتٍ (Parameterisation) هو ما يغلقها فعلاً. أما الجزء من الاستعلام الذي لا يمكن ربطه معاملاً، كاسم عمود يُختار للترتيب، فيجب التحقق منه مقابل قائمة سماح ثابتة من الأسماء؛ وحسابات قاعدة البيانات ذات أقل الصلاحيات تحدّ من الضرر إن فات موضع حقن.
استعلام مبني بالدمجقابل للحقن
يُدمَج المدخل في نص الاستعلام
sql = "... WHERE email = '" + input + "'"
- كيف يُستخدم المدخل:
- يُدمَج في نص الاستعلام فيمكن أن يصير شيفرة
- علامة اقتباس مفردة
'في المدخل: - تكسر جملة SQL — خطأ قاعدة بيانات أو نتائج متغيّرةفشل
- ما يُظهره الاختبار:
- عيب يُبلَّغ عنه: المدخل يُحلَّل بوصفه SQL
استعلام ذو معاملاتآمن
نص الاستعلام ثابت والمدخل مربوط
sql = "... WHERE email = ?"; params = [ input ]
- كيف يُستخدم المدخل:
- يُرسَل إلى قاعدة البيانات كقيمة منفصلة لا كشيفرة
- علامة اقتباس مفردة
'في المدخل: - تُقارَن بوصفها حرفاً عادياً؛ دون خطأنجاح
- ما يُظهره الاختبار:
- المدخل يُعامَل كبيانات؛ باب الحقن مغلق
النسخة النصية
-- Vulnerable: input is pasted into the SQL text, so it can act as code
sql = "SELECT * FROM users WHERE email = '" + input + "'"
input = ben@shop.test -> ... WHERE email = 'ben@shop.test'
input = ' OR '1'='1 -> ... WHERE email = '' OR '1'='1' (logic changed)
-- Safe: the query text is fixed; input is bound as a separate value
sql = "SELECT * FROM users WHERE email = ?"
params = [ input ]
input = ' OR '1'='1 -> compared as text; matches no rowماذا تُبلّغ
يتيح تقرير الحقن الجيد للمطوّر أن يعيد إنتاج العيب ويصلحه دون تخمين. اذكر نقطة النهاية والمعامل بالضبط، والمدخل الذي أرسلته، والاستجابة التي تُثبت أن المدخل فُسِّر، والاستجابة لمدخل عادي بوصفها مرجعاً للمقارنة (Control). وبيّن الأثر من حيث ما يتحكم فيه المفسّر، وأوصِ بالحل.
- الموضع: الرابط أو الشاشة، وطريقة HTTP، والمعامل أو الحقل أو الترويسة أو ملف تعريف الارتباط بالضبط.
- المدخل والدليل: الأحرف التي أرسلتها بدقة والنتيجة المرصودة — نص الخطأ أو السلوك المختلف أو رمز الحالة — مع مدخل عادي بجانبه للمقارنة.
- الأثر والخطورة: ما يتحكم فيه المفسّر المتأثر (المصادقة، جدول بيانات، صدفة)، مع تقييم على مقياس الخطورة لدى فريقك.
- الحل: استعلامات ذات معاملات أو واجهة المفسّر الآمنة، مع التحقق وأقل الصلاحيات دفاعاً في العمق.
- النطاق: أشِر إلى أنك اختبرت النظام المصرَّح به فقط وتوقفت عند الإثبات، ليعرف القارئ أنه لم تُمَسّ أي بيانات.
أخطاء شائعة
- اختبار الحقول التي تُظهرها الواجهة فقط، أو التوقف عند أول حقل قابل للحقن، بدلاً من فحص كل مدخل يصل إلى مفسّر، بما في ذلك الترويسات وملفات تعريف الارتباط ومعاملات الروابط والمدخلات الخاصة بالواجهات البرمجية.
- اعتبار التحقق من المدخلات أو تهريبها هو الحل؛ فهما يساعدان، لكن الاستعلامات ذات المعاملات هي ما يوقف حقن SQL، والتهريب ليس إلا ملاذاً أخيراً.
- تشغيل حمولات مُدمِّرة. لا يحتاج المختبِر أبداً إلى حذف البيانات أو قراءتها لإثبات الحقن؛ فأخفّ فحص يكفي.
- اختبار نظام لا تملكه وليس لديك إذن مكتوب باختباره.
- الإبلاغ بـ«وُجد حقن SQL» دون نقطة نهاية ولا مدخل ولا دليل، فلا يستطيع المطوّر إعادة إنتاجه.
- افتراض أن SQL وحده هو المهم، وإغفال حقن أوامر نظام التشغيل وLDAP وXPath والقوالب.
من منظور ضمان الجودة
في الفريق، يبدأ اختبار الحقن عند مراجعة المتطلبات والتصميم: فكل موضع يبني فيه التطبيق استعلاماً أو أمراً من مدخل هو خطر يُرفَع قبل كتابته، وسؤال «هل يستخدم هذا الاستعلام معاملات؟» ينتمي إلى مراجعة الشيفرة. وأثناء الاختبار تعمل من قائمة بالمدخلات التي تصل إلى المفسّرات، وتُجري الفحوص الآمنة نفسها على كلٍّ منها، وتحتفظ بمدخل عادي للمقارنة مقابل كل مدخل مُعَدّ خصيصاً ليكون دليلك واضحاً.
وتنسّق مع المطوّرين، ومع فريق أمن في الأنظمة الأكبر: تتفقون كتابةً على ما يُسمح لك باختباره ومتى، وتستخدم بيئة غير إنتاجية بحسابات أقل صلاحيات، وتسلّم النتيجة المؤكَّدة بخطوات إعادة الإنتاج وتوصية بالحل. وسجّل ما اختبرته وما تركته عمداً، ليرى المختبِر التالي والمدقّق النطاق.
تمرين عملي
حوّل بحثاً قابلاً للحقن إلى بحث آمن وأبلغ عنه
نقطة نهاية لبحث المنتجات GET /api/products?q=<term> تبني استعلامها بدمج النصوص في شيفرة التطبيق: "SELECT * FROM products WHERE name LIKE '%" + q + "%'". على نظام اختبار تملكه، ترسل q بعلامة اقتباس مفردة فتحصل على خطأ قاعدة بيانات؛ بينما تُعيد كلمة بحث عادية نتائج. حدّد موضع الحقن، واختر فحص تأكيد آمناً، وصِف السلوك المتوقع قبل الحل وبعده، واكتب مسوّدة تقرير العيب.
- سمِّ المفسّر وقناة المدخل بالضبط.
- اكتب أخفّ فحص يؤكّد أن المدخل يُحلَّل بوصفه SQL، ومدخلاً عادياً للمقارنة.
- اكتب نسخة الاستعلام ذات المعاملات، والسلوك الذي تتوقعه بعد الإصلاح.
- اكتب مسوّدة التقرير: الموضع، والمدخل، والدليل، والأثر، والخطورة، والحل.
إظهار الإجابة النموذجية
المفسّر: قاعدة بيانات SQL. القناة: معامل سلسلة الاستعلام q في GET /api/products.
الفحص: علامة اقتباس مفردة ' قيمةً لـq تُسبّب خطأ قاعدة البيانات؛ والمدخل المرجعي للمقارنة: كلمة بحث عادية مثل pen تُعيد القائمة المعتادة. فحص التأكيد: علامتا اقتباس ''، وهما في SQL علامة اقتباس حرفية واحدة داخل القيمة النصية، تُخفيان الخطأ. وظهور الخطأ واختفاؤه بحسب عدد العلامات دليلٌ على أن q يُحلَّل بوصفه SQL؛ ولا حاجة إلى حمولة مُدمِّرة أو قارئة للبيانات.
النسخة ذات المعاملات: SELECT * FROM products WHERE name LIKE ? مع القيمة المربوطة %pen% (يضيف التطبيق علامتَي % إلى القيمة لا إلى نص SQL)، فتصير كلمة البحث قيمةً لا جزءاً من نص الاستعلام. وبعد الإصلاح يظل q=pen يُعيد الأقلام، وتُعيد ' نتيجة عادية (المنتجات التي يحوي اسمها فاصلة عليا، ولا شيء في الغالب) دون خطأ قاعدة بيانات.
التقرير: الموضع GET /api/products، المعامل q. المدخل: علامة اقتباس مفردة '، وأُكِّد بـ''. الدليل: خطأ قاعدة بيانات عند ' (اقتبس الرسالة)، ولا خطأ عند ''، والقائمة العادية عند q=pen. الأثر: استعلام البحث قابل للحقن، فتنكشف بيانات products وربما جداول أخرى يستطيع حساب قاعدة البيانات قراءتها؛ قيّمه على مقياس الخطورة لدى الفريق، وغالباً ما يكون حرجاً (Critical) أو حاجباً (Blocker). الحل: استخدم استعلاماً ذا معاملات؛ وأضف حسابات قاعدة بيانات بأقل الصلاحيات واحتفظ بالتحقق من المدخلات دفاعاً في العمق. النطاق: اختُبر على نظام الاختبار المملوك فقط وتوقّف عند الإثبات؛ ولم تُعدَّل بيانات ولم تُستخرَج.
أسئلة شائعة
هل اختبار الحقن هو نفسه اختبار الاختراق؟
لا. اختبار الاختراق هجوم مصرَّح به واسع ومحدَّد الزمن غالباً، يجريه مختص على نظام كامل. أما اختبار الحقن فهو فحص أمني مركّز يستطيع أي مختبِر إجراؤه على مدخلات محددة. وكلاهما يحتاج إذناً؛ ويندمج اختبار الحقن طبيعياً في تصميم الاختبار المعتاد.
هل أحتاج إلى معرفة SQL لاختبار حقن SQL؟
القليل منها يساعدك على قراءة الاستعلامات وفهم سبب نجاح الفحص، لكن يمكنك تأكيد كثير من مواضع الحقن بالسلوك وحده: رمز خاص يُسبّب خطأً أو يغيّر النتيجة حيث لا تفعل ذلك قيمة عادية. ودليل «SQL للمختبِرين» يتعمّق أكثر.
لماذا لا يكفي التحقق لإيقاف الحقن؟
يضيّق التحقق ما يُقبَل من مدخلات، لكن البيانات الصالحة قد تحتوي رموزاً خاصة — فاسم O'Brien فيه فاصلة عليا — وقد تُتجاوَز القواعد أو تُنسى. وتهريب هذه الرموز ليس إلا ملاذاً أخيراً؛ أما فصل البيانات عن الشيفرة بالاستعلامات ذات المعاملات فيزيل الثغرة من منبعها.
ما درجة الخطورة التي يُعطاها عيب الحقن؟
يعتمد على ما يتحكم فيه المفسّر وما إذا كانت المصادقة أو البيانات الحساسة في المتناول، لكن حقناً مؤكَّداً في استعلام متّجه إلى الإنتاج يكون عادةً حرجاً أو حاجباً. سجّل التبرير على مقياس الخطورة لدى فريقك بدلاً من التخمين.
المراجع
- OWASP Top 10:2025أخطر عشرة مخاطر أمنية لتطبيقات الويب، مع كيفية اختبار كل منها والوقاية منه.
- OWASP Web Security Testing Guide (WSTG)المنهجية المرجعية لاختبار تطبيقات الويب وواجهات API بحثاً عن نقاط الضعف الأمنية، اختباراً تلو الآخر.
- OWASP Cheat Sheet Series: SQL Injection Preventionالاستعلامات ذات المعاملات، والإجراءات المخزنة المستخدمة بأمان، والتحقق بقائمة السماح، وأقل الصلاحيات — الدفاعات التي ينبغي أن يؤكدها اختبار قاعدة البيانات.
- OWASP Cheat Sheet Series: Injection Preventionمنع حقن SQL وأوامر النظام وغيرها عبر التعامل بالمعاملات والتحقق والتهريب.
تدرّب بأدوات متقن
ولّد مدخلات مليئة بالأحرف الخاصة: علامات الاقتباس، والأحرف الوصفية لـ SQL/HTML/JSON، وأحرف التحكم، والرموز التعبيرية، وحيل المسارات.
ولّد حالات اختبار سلبية لحقول النماذج وواجهات API: قيم فارغة وnull ونوع خاطئ وطول زائد وحقن وصيغة غير صالحة.
فحص جمل SQL بحثاً عن مشكلات الصياغة والأقواس غير المتوازنة والسلاسل النصية غير المغلقة والأنماط الخطرة.
ولّد سيناريوهات اختبار عالية المستوى تغطي الجوانب الوظيفية والسلبية والأمنية وسهولة الاستخدام والتوافق لأي ميزة.
أنشئ طلبات HTTP وأرسلها (الطريقة وعنوان URL والترويسات والمصادقة والجسم) وافحص الاستجابة — بديل خفيف لـ Postman داخل متصفحك.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.