0Pricing
Cloud & IT Cert Prep · درس

التحقق من المدخلات وترميز المخرجات

طبّقوا التحقق من المدخلات على جانب الخادم وترميز المخرجات المدرك للسياق لتحييد ثغرات الحقن وXSS قبل استغلالها.

التحقق من المدخلات وترميز المخرجات درس مجاني في Cloud & IT Cert Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Cloud & IT Cert Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Cloud & IT Cert Prep 4 دروس في المجموع.

لماذا تُعد المدخلات خطرة

كل جزء من البيانات تتلقاه التطبيقات من خارجها — مثل مدخلات نماذج المستخدمين، ومعلمات عناوين URL، وترويسات HTTP، وأجسام طلبات API، وعمليات تحميل الملفات — يمكن أن يكون خاضعًا لتحكم المهاجم. ومن دون التحقق، يحقن المهاجمون أوامر SQL، ونصوص HTML، وأوامر shell، وتوجيهات XML/LDAP في مسارات تدفق بيانات التطبيق. ويُعد التحقق من المدخلات وترميز المخرجات ضابطَي التحكم الأساسيين لتحييد ثغرات الحقن قبل أن تتمكن من إحداث ضرر.

ما المقصود بالتحقق من المدخلات؟

يتحقق التحقق من المدخلات من توافق البيانات المستلمة مع النوع والتنسيق والطول ونطاق القيم المتوقع قبل أن يعالجها التطبيق. ويجب أن يكون التحقق على جانب الخادم — إذ يمكن للمهاجمين تجاوز التحقق على جانب العميل في JavaScript بسهولة عبر اعتراض الطلبات باستخدام أدوات مثل Burp Suite. ويجب ألا يقبل اسم المستخدم إلا الأحرف الأبجدية الرقمية، كما يجب ألا يقبل حقل التاريخ إلا تنسيقات التواريخ الصحيحة، وأن يطابق حقل البريد الإلكتروني صيغة RFC 5322.

# Server-side input validation examples:

# Validate username: allow only alphanumeric and underscore
# Pattern: ^[a-zA-Z0-9_]{3,20}$
# Reject: 'admin--', "' OR 1=1--", '<script>alert(1)</script>'

# Validate age: must be integer between 0 and 120
# Reject: -1, 999, 'abc', '18; DROP TABLE users'

# Validate email: match RFC 5322 pattern, max 254 chars
# Reject: 'a@b' (too short), attacker@evil.com<script>...

التحقق بقائمة السماح مقابل قائمة الحظر

يحدد التحقق بقائمة السماح (القائمة البيضاء) بدقة ما هو مسموح به، ويرفض كل ما عداه. أما التحقق بقائمة الحظر (القائمة السوداء) فيحدد ما هو غير مسموح به، ويسمح بكل ما عداه. ويُفضّل دائمًا استخدام قائمة السماح، لأن المهاجمين يكتشفون باستمرار تقنيات جديدة لتجاوز قوائم الحظر. فعلى سبيل المثال، تحاول قوائم حظر حقن SQL حظر SELECT وUNION والمحارف --، لكن الترميزات المبتكرة غالبًا ما تتجاوز هذه المرشحات. أما قائمة السماح التي لا تسمح في حقل رقمي إلا بالأرقام، فلا يمكن تجاوزها.

# Allowlist (GOOD): only allow expected characters
# username_pattern = '^[a-zA-Z0-9_]{3,20}$'
# If input does not match -> reject with 400 Bad Request

# Denylist (WEAK): try to block known-bad patterns
# reject_patterns = ["'", '--', 'UNION', 'SELECT', 'DROP']
# Problem: attacker uses: SE%00LECT, UNION%0aALL, encoded chars
# Denylist is incomplete by definition -> prefer allowlist

الاستعلامات ذات المعلمات تمنع حقن SQL

في تفاعلات قواعد البيانات، تُعد الاستعلامات ذات المعلمات (العبارات المُعدّة) الدفاع الحاسم ضد حقن SQL. إذ يُحدَّد هيكل الاستعلام بصورة منفصلة عن البيانات التي يقدّمها المستخدم، ولذلك لا يفسّر محرك قاعدة البيانات المدخلات على أنها صياغة SQL. وحتى إذا أدخل المستخدم ' OR '1'='1، فستُعامل كسلسلة نصية حرفية للمعلمة، لا كتعليمة SQL قابلة للتنفيذ. وتتوفر الاستعلامات ذات المعلمات في كل لغة رئيسية وبرنامج تشغيل لقواعد البيانات.

# VULNERABLE: string concatenation (SQL injection possible)
# query = 'SELECT * FROM users WHERE name = ' + user_input
# Attack: user_input = "' OR '1'='1" -> returns ALL users

# SAFE: parameterized query
# query = 'SELECT * FROM users WHERE name = ?'
# cursor.execute(query, (user_input,))
# The ? is a placeholder; user_input is passed separately
# The DB driver handles escaping automatically
# Attack input: "' OR '1'='1" -> treated as literal string

ما المقصود بترميز المخرجات؟

يحوّل ترميز المخرجات المحارف الخاصة في البيانات قبل إدراجها في سياق إخراج (HTML أو JavaScript أو SQL أو URL أو أوامر shell). ويضمن ذلك ألا تُفسَّر البيانات القادمة من سياق ما على أنها تعليمات برمجية قابلة للتنفيذ في سياق آخر. والمبدأ الأساسي هو الترميز الواعي بالسياق: إذ يجب أن يتوافق الترميز المطبَّق مع سياق الإخراج. ويعمل ترميز HTML، وترميز URL، وترميز JavaScript، ووضع علامات الاقتباس على وسيطات shell، كلٌّ منها على تحييد الحقن في سياقه الخاص.

ترميز مخرجات HTML يمنع XSS

عند عرض البيانات التي يقدّمها المستخدم في HTML، يجب ترميزها وفق HTML لمنع البرمجة النصية عبر المواقع (XSS). يتحول المحرف < إلى &lt;، ويتحول > إلى &gt;، ويتحول & إلى &amp;. فإذا أدخل المهاجم <script>alert('XSS')</script>، فسيعرضه ترميز HTML كنص مرئي بدلًا من تنفيذ النص البرمجي. توفر كل أطر عمل الويب دوال لترميز HTML — فاستخدموها باستمرار.

# Without encoding (VULNERABLE to XSS):
# html = '<p>Hello, ' + username + '</p>'
# If username = '<script>document.cookie</script>'
# -> script executes in victim browser

# With HTML encoding (SAFE):
# html = '<p>Hello, ' + html_encode(username) + '</p>'
# html_encode('<script>...') -> '&lt;script&gt;...&lt;/script&gt;'
# -> Displays as text, not executable script

قواعد الترميز الخاصة بالسياق

تتطلب سياقات الإخراج المختلفة استراتيجيات ترميز مختلفة. متن HTML: ترميز < > & ' ". سمات HTML: ترميز المحارف نفسها، مع فرض استخدام السمات المحاطة بعلامات اقتباس. سياق JavaScript: استخدام ترميز JSON أو إفلات السلاسل النصية في JavaScript. معلمات URL: تطبيق الترميز المئوي للمحارف الخاصة. أوامر shell: تجنب إنشاء أوامر shell من مدخلات المستخدم تمامًا؛ واستخدام واجهات API للغة مع مصفوفات الوسائط بدلًا من دمج السلاسل النصية مع مفسرات shell.

# Context-aware encoding examples:

# HTML body context:
# safe_html = '&lt;script&gt;' (renders as text)

# URL parameter context:
# safe_url = 'search?q=hello%20world%26more'

# JavaScript string context (in JSON):
# safe_js = '{"name": "O\\u0027Reilly"}'

# Shell command (AVOID string concat - use array instead):
# UNSAFE: os.system('ping ' + user_input)
# SAFE:   subprocess.run(['ping', '-c', '1', user_input])

التحقق عبر طبقات متعددة

يجب إجراء التحقق من المدخلات عبر طبقات متعددة، وليس عند نقطة نهاية API فقط. يحسّن التحقق على جانب العميل تجربة المستخدم (من خلال تقديم ملاحظات فورية)، لكن يجب عدم الوثوق به أمنيًا مطلقًا. ويُعد التحقق في API أو وحدة التحكم طبقة الأمان الأساسية. ويفرض التحقق في الخدمة أو منطق الأعمال قواعد المجال. كما توفر قيود قاعدة البيانات (NOT NULL وCHECK وFOREIGN KEY) طبقة دفاع أخيرة. ويعني مبدأ الدفاع في العمق أن تجاوز طبقة واحدة لا يؤدي فورًا إلى استغلال الثغرة.

التحقق من تحميل الملفات

تُعد مدخلات تحميل الملفات خطرة بصفة خاصة. فقد يحمّل المهاجمون web shells (متنكرة في هيئة صور)، أو مستندات ضارة (تحتوي على وحدات ماكرو)، أو ملفات ضخمة (تسبب DoS). ويجب أن يشمل التحقق: التحقق من نوع الملف من خلال المحتوى (البايتات السحرية)، وليس من الامتداد فقط؛ وفرض حد أقصى لحجم الملف؛ وتخزين الملفات المحمّلة خارج جذر الويب؛ وإعادة تسمية الملفات على الخادم لمنع المسارات القابلة للتنبؤ؛ وفحصها باستخدام مكافحة الفيروسات أو sandbox؛ وعدم تنفيذ الملفات المحمّلة مباشرةً مطلقًا.

# File upload validation steps:
# 1. Check Content-Type header (client-provided, not trusted alone)
# 2. Read first bytes (magic bytes):
#    JPEG: FF D8 FF | PNG: 89 50 4E 47 | PDF: 25 50 44 46
# 3. Reject if magic bytes don't match expected type
# 4. Enforce max size: reject > 10MB
# 5. Strip original filename, assign random UUID filename
# 6. Store in /var/uploads/ (NOT /var/www/html/)
# 7. Serve via CDN or application route (not direct URL)

التحقق من المدخلات في واجهات API

تستخدم التطبيقات الحديثة واجهات REST API وGraphQL على نطاق واسع، ما يتطلب التحقق من أجسام طلبات JSON/XML. وتحدد أطر التحقق من API، مثل JSON Schema، الحقول المطلوبة، وأنواع البيانات، وأنماط السلاسل النصية، ونطاقات القيم. ويمنع تحديد عمق GraphQL الاستعلامات المتداخلة بعمق من التسبب في DoS. كما يمنع تحديد معدل الطلبات إساءة الاستخدام الآلية حتى عندما تكون المدخلات الفردية صالحة. ويجب إجراء التحقق من المخطط قبل أن يعالج أي منطق أعمال الطلب.

# JSON Schema validation example:
# POST /api/register body schema:
# {
#   'type': 'object',
#   'required': ['username', 'email', 'password'],
#   'properties': {
#     'username': {'type': 'string', 'pattern': '^[a-zA-Z0-9_]{3,20}$'},
#     'email':    {'type': 'string', 'format': 'email', 'maxLength': 254},
#     'password': {'type': 'string', 'minLength': 12, 'maxLength': 128}
#   },
#   'additionalProperties': false
# }

رسائل الخطأ وتسريب المعلومات

يمكن أن تكشف رسائل الخطأ المعادة إلى المستخدمين عن غير قصد معلومات حساسة تساعد المهاجمين. فقد تكشف رسائل أخطاء قاعدة البيانات أسماء الجداول وأنواع الأعمدة أو صياغة SQL. كما تكشف تتبعات المكدس إصدارات أطر عمل التطبيق ومسارات الملفات. ويمكن لأخطاء التحقق التفصيلية من المدخلات أن تؤكد للمهاجم المحارف المرفوضة، ما يساعده على إعداد محاولات تجاوز. وتتمثل أفضل ممارسة في إعادة رسائل خطأ عامة وسهلة الفهم للمستخدم إلى العملاء (مثل Invalid input)، مع تسجيل معلومات الخطأ التفصيلية على جانب الخادم لتصحيح أخطاء المطورين. ولا تعرضوا رسائل الاستثناءات الأولية للمستخدمين النهائيين مطلقًا.

# UNSAFE: returning detailed database error to user
# Error: 'You have an error in your SQL syntax near ... at line 1'
# Reveals: database type (MySQL), partial query structure

# UNSAFE: stack trace in API response
# Error: 'java.sql.SQLException at com.company.UserDAO.findByName:47'
# Reveals: framework (Java), class names, line numbers

# SAFE: generic error response to client
# HTTP 400 Bad Request: { 'error': 'Invalid request parameters' }
# Server log (internal only): full exception with stack trace
# Monitoring: alert on high error rates -> investigate internally

تحقق سريع

اختبروا مدى فهمكم لمفاهيم CompTIA Security+ (SY0-701) الواردة في هذا الدرس.

مراجعة الدرس

تعلمتم في هذا الدرس أن: التحقق من المدخلات على جانب الخادم باستخدام قوائم السماح يضمن معالجة البيانات المتوقعة فقط، وأن الاستعلامات ذات المعلمات تمنع حقن SQL من خلال فصل البيانات عن بنية الاستعلام، وأن ترميز المخرجات الواعي بالسياق يمنع XSS وهجمات الحقن الأخرى عبر تحييد المحارف الخاصة قبل دخولها إلى سياقات HTML أو JavaScript أو URL أو shell. بعد ذلك، سنستكشف الإدارة الآمنة للأسرار وحقن متغيرات البيئة.

الأسئلة الشائعة

هل درس «التحقق من المدخلات وترميز المخرجات» مجاني؟

نعم — نص درس «التحقق من المدخلات وترميز المخرجات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Cloud & IT Cert Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Cloud & IT Cert Prep 4 دروس في المجموع.

ماذا ستتعلم في «التحقق من المدخلات وترميز المخرجات»؟

طبّقوا التحقق من المدخلات على جانب الخادم وترميز المخرجات المدرك للسياق لتحييد ثغرات الحقن وXSS قبل استغلالها. تتمرن على Cloud & IT Cert Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Cloud & IT Cert Prep؟

لا تُشترط خبرة سابقة. Cloud & IT Cert Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «التحقق من المدخلات وترميز المخرجات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Cloud & IT Cert Prep هذا؟

نعم. كل درس في Cloud & IT Cert Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التحقق من المدخلات وترميز المخرجات
  2. الإدارة الآمنة للأسرار ومتغيرات البيئة
  3. أمان التبعيات وتحليل تكوين البرمجيات
  4. DevSecOps: نقل الأمان إلى مراحل مبكرة من مسارات التطوير
← العودة إلى Cloud & IT Cert Prep