التحقق من المدخلات وترميز المخرجات
تحقق من جميع المدخلات على جانب الخادم، ورمّز المخرجات في السياق الصحيح، وامنع الحقن
التحقق من المدخلات وترميز المخرجات درس مجاني في Cyber Security Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Cyber Security Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Cyber Security Academy 4 دروس في المجموع.
أهمية التحقق من المدخلات
تنشأ ثغرات الحقن — مثل SQL والأوامر وLDAP وXPath وغيرها — عندما تُفسَّر المدخلات غير الموثوقة على أنها تعليمات برمجية. ويضمن التحقق من المدخلات توافق البيانات مع الأنواع والأطوال والتنسيقات المتوقعة قبل معالجتها أو تخزينها أو إرجاعها.
التحقق باستخدام قائمة السماح مقابل قائمة الرفض
يحدد التحقق باستخدام قائمة السماح ما هو مقبول بالفعل: الأحرف الأبجدية الرقمية فقط، أو الأعداد الصحيحة ضمن النطاق 1-100 فقط، أو تنسيقات البريد الإلكتروني الصالحة فقط. أما قائمة الرفض فتحاول حظر المدخلات السيئة المعروفة، وتظل دائمًا غير مكتملة. لذا يُفضّل استخدام قوائم السماح.
التحقق من جانب الخادم
يحسّن التحقق من جانب العميل تجربة المستخدم، لكنه لا يوفر أي أمان — إذ يمكن للمهاجمين تجاوزه بسهولة باستخدام أدوات المطور في المتصفح أو curl. احرص دائمًا على التحقق من جانب الخادم. فالتحقق من جانب العميل إجراء تيسيري، أما التحقق من جانب الخادم فهو الضابط الأمني.
التحقق من المدخلات لأنواع البيانات المختلفة
الأرقام: تحقق من النوع والنطاق. السلاسل النصية: تحقق من الطول ومجموعة الأحرف. التواريخ: حلّلها بصرامة وتحقق من النطاق. الملفات: تحقق من الامتداد AND من وحدات البايت السحرية/نوع MIME — لا تثق بالامتداد وحده مطلقًا. عناوين URL: حلّل مكونات المخطط والمضيف والمسار وتحقق منها.
الاستعلامات ذات المعلمات تمنع SQLi
أهم مخرج للتحقق من المدخلات في قواعد البيانات هو عدم تسلسل مدخلات المستخدم في SQL مطلقًا. استخدم الاستعلامات ذات المعلمات (العبارات المُعدّة)، بحيث تُمرَّر مدخلات المستخدم كمعلمة بدلًا من إدراجها داخل سلسلة الاستعلام.
// WRONG:
const q = "SELECT * FROM users WHERE name = '" + name + "'";
// RIGHT:
const q = "SELECT * FROM users WHERE name = $1";
await client.query(q, [name]);سياقات ترميز المخرجات
تتطلب السلسلة النصية نفسها ترميزًا مختلفًا بحسب السياق. جسم HTML: ترميز HTML (< > &). سمة HTML: ترميز سمات HTML. JavaScript: الهروب في JS. معلمة URL: ترميز URL (الترميز النسبي المئوي). يؤدي استخدام الترميز الخاطئ إلى ترك ثغرات يستغلها المهاجمون.
ترميز HTML لمواجهة XSS
لا تُدرج بيانات المستخدم مباشرةً في HTML مطلقًا. استخدم محرك قوالب أو مكتبة تُجري الهروب من HTML تلقائيًا. في React، يُعد {value} آمنًا؛ أما dangerouslySetInnerHTML فيتجاوز عملية الهروب. وفي Django، تُجري القوالب الهروب تلقائيًا ما لم تستخدم مرشح safe صراحةً.
ترميز سياق JavaScript
عند إدراج البيانات في JavaScript (مثل تهيئة متغير ببيانات المستخدم)، لا يكفي ترميز HTML. استخدم ترميز JSON: JSON.stringify(value). فهذا يمنع البيانات من الخروج من سياق سلسلة نصية حرفية في JS.
ترميز عناوين URL
يجب ترميز البيانات التي يزوّد بها المستخدم والمُدرجة في عناوين URL ترميزًا مئويًا باستخدام encodeURIComponent() (JS) أو urllib.parse.quote() (Python). ويمكن للبيانات غير المرمّزة التلاعب ببنية URL، مما يؤدي إلى عمليات إعادة توجيه مفتوحة أو اجتياز المسارات.
سياسة أمان المحتوى كدفاع متعدد الطبقات
تضيف CSP خط دفاع ثانيًا ضد XSS. وتمنع CSP الصارمة التي تستخدم قيم nonce تنفيذ البرامج النصية المضمنة حتى إذا حُقنت حمولة XSS، لأن المتصفح يرفض تنفيذ البرامج النصية التي لا تحتوي على سمة nonce الصحيحة.
منع XSS القائم على DOM
يحدث XSS القائم على DOM عندما تقرأ JavaScript من مصادر يتحكم فيها المهاجم (location.hash وdocument.URL وcookie) وتكتب إلى منافذ خطرة (innerHTML وdocument.write وeval). راجع جميع تدفقات البيانات من واجهات برمجة تطبيقات المتصفح إلى منافذ DOM باستخدام أدوات التحليل الساكن.
اختبار المعرفة
لماذا يُعد التحقق من المدخلات من جانب الخادم ضروريًا حتى عند تطبيق التحقق من جانب العميل؟
الملخص
يمثل التحقق من المدخلات (قوائم السماح، والتحقق من النوع، وحدود الطول) مقترنًا بترميز المخرجات الحساس للسياق (HTML وJS وURL ومعلمات SQL) وسائل الدفاع الأساسية ضد هجمات الحقن وXSS. ويجب تطبيق كلا الإجراءين من جانب الخادم دون استثناء.
الأسئلة الشائعة
هل درس «التحقق من المدخلات وترميز المخرجات» مجاني؟
نعم — نص درس «التحقق من المدخلات وترميز المخرجات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Cyber Security Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Cyber Security Academy 4 دروس في المجموع.
ماذا ستتعلم في «التحقق من المدخلات وترميز المخرجات»؟
تحقق من جميع المدخلات على جانب الخادم، ورمّز المخرجات في السياق الصحيح، وامنع الحقن تتمرن على Cyber Security Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Cyber Security Academy؟
لا تُشترط خبرة سابقة. Cyber Security Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «التحقق من المدخلات وترميز المخرجات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Cyber Security Academy هذا؟
نعم. كل درس في Cyber Security Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التحقق من المدخلات وترميز المخرجات
- إدارة التبعيات بأمان
- OWASP ASVS: معيار التحقق من أمان التطبيقات
- تقنيات مراجعة الشيفرة الآمنة