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

تطوير البرمجيات الآمن / متوسط: حدود التنفيذ والتحقق / الدرس 8

فصل البيانات عن تعليمات المفسر

استخدام واجهات منظمة وخرائط ثابتة بدلا من بناء صيغة تنفيذية من القيم.

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

أهداف الدرس

  • فصل معاملات القيم عن المعرفات البنيوية.
  • مراجعة دلالة الوسائط حتى عند غياب الصدفة.

تسمية المفسر في الوجهة

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

ربط القيم وربط الاختيارات البنيوية بخريطة

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

python فحص خطة استعلام منظمة بلا تنفيذ
orders = {"title": "title ASC, id ASC", "newest": "created_at DESC, id DESC"}
def query_plan(category, sort_key):
    if sort_key not in orders:
        return "UNSUPPORTED_SORT"
    return ("SELECT id, title FROM workshops WHERE category = ? ORDER BY " + orders[sort_key], (category,))

statement, values = query_plan("art", "title")
assert values == ("art",)
assert statement.endswith("ORDER BY title ASC, id ASC")
assert query_plan("art", "other") == "UNSUPPORTED_SORT"
print("query structure and values separated")
الناتج المتوقع
query structure and values separated

ينشئ البرنامج المحلي الكامل سلاسل وصفوفا فقط ولا ينفذ SQL أو يستخدم سائقا أو قاعدة. يبقى ربط القيم واقتباس المعرفات والصلاحيات وسلوك الاستعلام غير متحقق.

تذكر دلالة الوسائط بعد تحليل الصدفة

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

python ربط صيغة بقدرة مكتبة ضيقة
renderers = {"json":"library-json", "csv":"library-csv"}
def renderer_for(requested):
    return renderers.get(requested, "UNSUPPORTED_FORMAT")

assert renderer_for("json") == "library-json"
assert renderer_for("csv") == "library-csv"
assert renderer_for("--help") == "UNSUPPORTED_FORMAT"
print("report capability mapping checked")
الناتج المتوقع
report capability mapping checked

يفحص البرنامج الكامل ثلاثة قرارات محلية. السلسلة الشبيهة بخيار بيانات تدريب خاملة. لا يستدعي صدفة أو عملية أو عارضا أو ملفا، ولا يعالج تفسير الجداول لمحتوى CSV.

مراجعة التفسير المؤجل أيضا

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

التحقق من الواجهة المستخدمة فعلا

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

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

يمرر اتجاه الفرز كقيمة SQL عادية

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

يعني غياب الصدفة غياب خطر الوسائط

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

يفترض تحقق الإدخال حماية كل استخدام لاحق

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

اختبر فهمك

1. هل يستطيع استعلام معلمي قبول أي جزء ORDER BY يرسله العميل بأمان؟

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

لا. لا تمنح معاملات القيم إذنا بإرسال بنية SQL اعتباطية. اختر اسم فرز مدعوما واربطه بجزء ثابت يملكه التطبيق، ثم اربط القيم عبر السائق الفعلي. افحص المحول مستقلا؛ فلا ينفذ مثال خطة الاستعلام المحلي SQL.

2. اختيرت صيغة التقرير من json وcsv. ما سؤال CSV الإضافي الذي يبقى؟

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

تقيد الخريطة قدرة العارض، لكن برنامج الجداول قد يفسر محتوى الخلية بقواعده الخاصة. راجع المستهلك المقصود وسياسة تصدير CSV الآمنة مستقلا. لا يثبت اختيار مكتبة منظمة سلوكا آمنا تلقائيا في كل تطبيق لاحق يفتح النتيجة.

أهم ما تعلمته

  • افصل الصيغة الثابتة والقيم الخارجية.
  • تحتاج الواجهات المنظمة مراجعة دلالية.
  • ينشئ التفسير المؤجل حدود ثقة جديدة.

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