محتويات الدورة

أمان الويب / المتوسط: دفاعات المتصفح وتفسير البيانات / الدرس 8

منع الحقن بفصل البيانات

افصل القيم عن بنية الاستعلام والأمر والقالب وراجع صلاحيات المفسر نفسه.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • استخدم ربط المعلمات للقيم واختيار بنية مسموحة.
  • ميّز بناء الاستعلام الآمن من التفويض ودليل التنفيذ.

حدد المفسر وبنيته

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

اربط القيم بدلاً من تنسيق نص SQL

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

python عقد كامل لبناء الاستعلام دون اتصال
def note_query(organization, note_id):
    sql = "SELECT title FROM note WHERE organization = ? AND id = ?"
    return sql, (organization, note_id)

sql, values = note_query("lab-org-a", "lab-note-1")
assert sql == "SELECT title FROM note WHERE organization = ? AND id = ?"
assert values == ("lab-org-a", "lab-note-1")
assert "lab-org-a" not in sql

يبني البرنامج نص الاستعلام ومجموعة قيم مرتبة فقط، دون تنفيذ SQL أو اتصال قاعدة أو بحث بيانات. يوضح الفصل وشرط النطاق المقصود، لا سلوك المشغل الفعلي أو إنفاذ الوصول كاملاً.

اربط الخيارات المسموحة بصياغة ثابتة

تربط واجهات كثيرة القيم لا أسماء الجداول والأعمدة والمعاملات واتجاهات الفرز الاعتباطية. عند حاجة بنية متغيرة، اربط خياراً صغيراً معتمداً بجزء ثابت معروف بدلاً من قبول الخام. يختار المثال عقدي ترتيب ويرفض المجهول دون حمولة ضارة. إضافة خيار تغيير منتج يراجع ويختبر للترتيب والإذن. لا يوسع البديل الاستعلام أو يختار مورداً أشد امتيازاً بصمت. أظهر فصل قيمة المصدر والخيار البنيوي وسياسة التفويض حتى لا يغدو أحدها بديلاً عن الآخر.

python مثال كامل لاختيار بنية من قائمة مسموحة
def sort_clause(option):
    choices = {
        "title": "title ASC, id ASC",
        "recent": "created_at DESC, id DESC",
    }
    if option not in choices:
        raise ValueError("UNSUPPORTED_SORT")
    return choices[option]

assert sort_clause("title") == "title ASC, id ASC"
try:
    sort_clause("unlisted-choice")
except ValueError as error:
    assert str(error) == "UNSUPPORTED_SORT"
else:
    raise AssertionError("UNKNOWN_SORT_ACCEPTED")

تعيد الدالة ثوابت معتمدة ولا تنفذ شيئاً. يدخل حسم التعادل بـ id الثابت ضمن سياسة الترتيب الخيالية. ليست محلل SQL اعتباطياً أو بديلاً عن إذن القاعدة.

تجنب العبور للصدفة والقالب التنفيذي

فضل للمهمة الخارجية مكتبة مدعومة أو منفذاً ثابتاً بوسائط منظمة وسياسة خيارات ضيقة، لا سلسلة صدفة. لا تقيّم تعبير المستخدم أو تترجم نصه قالب تطبيق لتقديم تنسيق مرن. يخص الهروب كل مفسر ويهش عند جمع طبقات تحليل. لا يكون ORM أو الإجراء المخزن آمناً تلقائياً إن ركّب لاحقاً صياغة خاماً. راجع الموارد والصلاحيات والمخرج مع موضع الاستدعاء. تشرح الدورة الحدود الدفاعية ولا تطلق أمراً أو قاعدة أو حقناً تشغيلياً.

تحقق من الفصل عبر المهايئ الفعلي

يدعم اختبار البناء عقداً ضيقاً فقط. يتحقق التكامل المفوض من المشغل الحقيقي وشكل الاستعلام وأنواع المعلمات والمعاملة والخطأ ونطاق المورد. استخدم بيانات سليمة وحدود استخدام مشروع لا خدمة فعلية مستهدفة. قلل وصول البيانات كي لا تدير العملية موارد غير مرتبطة. اختبر الخيارات البنيوية غير المدعومة وقيم الأعمال المشوهة بصورة مستقلة، وراجع كل خام أو مخرج للمفسر. الغاية واجهة بيانات متوقعة بسلطة واضحة، لا حصانة ميزة كاملة بعبارة معدة واحدة.

الأخطاء الشائعة وإصلاحها

تعاد المعلمات لنص SQL

لماذا يحدث؟
تجاوز فصل القيم قبل التنفيذ.
كيف تصلحه؟
مرر عبر ربط المشغل الموثق.
كيف تتجنب تكراره؟
اختبر المهايئ وراجع الخام.

يقبل حقل ترتيب كصياغة خام

لماذا يحدث؟
عوملت البنية كقيمة مربوطة.
كيف تصلحه؟
اربط المعتمد بجزء ثابت.
كيف تتجنب تكراره؟
ارفض غير المدعوم صراحة.

يسمى الربط الآمن تفويضاً

لماذا يحدث؟
اختلط التفسير بنطاق المورد.
كيف تصلحه؟
افرض سياسة الفاعل والمورد مستقلة.
كيف تتجنب تكراره؟
ضمّن رفض النطاق الآخر.

اختبر فهمك

1. لماذا لا يستبدل كل معرّف SQL بمعلمة قيمة؟

اعرض الحل المشروح

تمثل المعلمات قيماً وفق قواعد المشغل، لا بنية لغة اعتباطية. استخدم الواجهات المدعومة وربط الخيارات المعتمدة للأجزاء البنيوية اللازمة، ثم تحقق من الاستعلام الفعلي والصلاحيات. لا تعالج محدودية المعلمة بتركيب صياغة لم تتحقق منها.

2. يربط الاستعلام note_id ويغفل المؤسسة. هل هو آمن؟

اعرض الحل المشروح

يعالج الربط تفسير تلك القيمة لا تفويض المستأجر. طبق نطاق المؤسسة المتحقق وسياسة الفعل، واختبر الفاعل غير المرتبط وثبات الحالة المحمية عند الرفض. قد يكون الاستعلام سليماً من حيث الربط وخاطئاً تماماً من حيث من يحق له قراءة النتيجة.

أهم ما تعلمته

  • افصل القيمة عن بنية المفسر.
  • احصر خيارات البنية اللازمة.
  • الربط والإذن ودليل التشغيل منفصلة.

المراجع الرسمية