Ruby / التكامل: البيانات والموارد وأدلة التنفيذ والثقة / الدرس 17
فصل التحميل والتوجيه عن البيانات غير الموثوقة
استخدم مسارات تحميل ثابتة وخرائط أفعال مغلقة وفك بيانات صريحا ومدخلا محدودا دون تحويل نص المستخدم لشيفرة Ruby.
في هذه الصفحة
أهداف الدرس
- ميّز تحميل الشيفرة وتحليل البيانات وتفويض الموارد.
- استخدم قائمة سماح صريحة بدلا من توجيه طرق اعتباطي بنص خارجي.
يحتاج التنفيذ المرن حدود ثقة صريحة
تستطيع Ruby تحميل الملفات وتقييم الشيفرة وتوجيه الطرق ديناميكيا واستعادة كائنات. هذه قدرات قوية لا طرق عامة لتحليل المستخدم. أبق غير الموثوق بيانات وحوله لنموذج صغير متحقق. لا يفوض كون الطريقة عامة للعميل اختيارها اعتباطيا، ولا تثبت مطابقة المعرف ملكية المورد. حدّد الطرف والفعل والمورد وقاعدة الحالة عند المرجع. يستخدم الدرس مدخلات محلية اصطناعية ولا ينفذ هجوما أو مسحا أو حسابا أو أمر مضيف.
اربط الاختيارات الخارجية بعمليات محدودة
تقبل الخريطة count و ids فقط، وتعطي غيرهما نتيجة غير مدعوم. لا تمرر الاسم إلى eval أو send أو public_send بلا ضبط. يحتاج المعالج سجلات صالحة وتفويضا في الحقيقي. يمنع تجميد الغلاف تعديله العادي ولا يحول كل كائن داخلي إلى قدرة آمنة ثابتة. صغّر المجموعة وراجع آثار كل معالج. النتيجة محللة لغياب المفسر.
ACTIONS = {
'count' => ->(records) { records.length.to_s },
'ids' => ->(records) { records.map { |record| record.fetch(:id) }.join(',') }
}.freeze
def dispatch(name, records)
handler = ACTIONS[name]
return 'unsupported action' unless handler
handler.call(records)
end
records = [{id: 'A-1'}, {id: 'A-2'}]
puts dispatch('count', records)
puts dispatch('unknown', records)
2
unsupported action
المخرج المتوقع 2 ثم unsupported action. يقيد أسماء التوجيه فقط ولا يصادق أو يتحقق من كل سجل. لم يُنفذ السكربت.
هدف require شيفرة موثوقة لا حقل مدخل
تحمل require خاصية وفق قواعد Ruby وقد تعيد load تقييم المصدر. تحل require_relative نسبة للملف المستدعي لا مجلد عمل اعتباطي. لا تشتق هدف التحميل من طلب غير موثوق مباشرة. Gemfile و gems اعتماديات تنفيذية لها مصدر وتوافق يضبطهما المشروع. يستخدم المثال ملفين باسم مساعد ثابت للتوضيح فقط؛ لا يُنشآن أو يُحمّلان على المضيف. اختر الأسماء والاستيراد الصريح لفهم الآثار.
أظهر المساعد المحمّل وواجهته
يعرف archive_format.rb عملية مسماة، ويطلبه المدخل صراحة قبل استدعائها. يحتاج التنفيذ الملفين معا في مجلد معزول يملكه المتعلم؛ ولا تكفي كتلة واحدة. هذا ترتيب تحميل لا صندوق عزل؛ فقد تفعل شيفرة موثوقة التنفيذ أي أثر في تنفيذها. راجع آثار المستوى الأعلى وتجنب اتصالات خدمات أو ترقيعا عاما خفيا عند الاستيراد. يحسن المسار الثابت التوقع ولا يصدق جودة الشيفرة أو أمانها.
module ArchiveFormat
def self.label(id)
"[#{id}]"
end
end
يعرف الملف طريقة وحدة ولا يخرج شيئا وحده. هو جزء من مثال ملفين ولم يُحمّل.
require_relative 'archive_format'
puts ArchiveFormat.label('A-8')
[A-8]
إذا وُضع بجانب المساعد السابق فالمخرج المتوقع [A-8]. لم تُنشأ الملفات أو تنفذ أثناء التأليف.
اختر واجهات بيانات لا تستعيد سلوكا اعتباطيا
لا تناسب Marshal.load غير الموثوق، وتحتاج أوضاع استعادة الكائنات غير الآمنة في غيرها التحليل نفسه. فضّل صيغة بيانات مقيدة وتحققا صريحا؛ فحتى JSON دون إضافات تحتاج الشكل والحجم والمجال. لا تدخل المدخل في صياغة shell أو regexp باعتبار الهروب عاما لكل سياق. قلّل السجلات بأمان. افحص التوجيه والحقول المرفوضة والتحميل والتسلسل معزولا ومخولا. لا تنفذ الدورة تقييما ديناميكيا أو هجوم فك أو عملية فرعية أو تثبيت أو اختبار أمن.
الأخطاء الشائعة وإصلاحها
يختار طلب طريقة عامة غير مقصودة.
- لماذا يحدث؟
- مُرر نص خارجي لتوجيه ديناميكي بلا تقييد.
- كيف تصلحه؟
- ترجم بخريطة مغلقة وفوض عملية المورد مستقلا.
- كيف تتجنب تكراره؟
- راجع الأفعال المتاحة ولا تعتمد الرؤية وحدها.
ينفذ تحميل مسار يختاره المستخدم شيفرة مفاجئة.
- لماذا يحدث؟
- عومل تحميل الشيفرة كاسترجاع بيانات.
- كيف تصلحه؟
- ثبّت الأهداف أو اجعلها ملك التطبيق واستخدم قارئ بيانات للبيانات.
- كيف تتجنب تكراره؟
- افصل مصدر الاعتماد عن تحقق المدخل.
يُوثق كائن مسلسل لمجرد نجاح تحليله.
- لماذا يحدث؟
- اختلطت استعادة الكائن بفك بيانات مقيد.
- كيف تصلحه؟
- اختر حدا آمنا للبيانات وتحقق من مخططها صراحة.
- كيف تتجنب تكراره؟
- راجع أوضاع المحلل وبناء الكائن المسموح قبل قبول الخارج.
اختبر فهمك
1. هل يجعل public_send بدلا من send أسماء الطرق الخارجية الاعتباطية آمنة؟
اعرض الحل المشروح
لا. يقيّد الرؤية وقد يكشف طرقا عامة لم يقصد المنتج اختيارها. استخدم خريطة مغلقة وتحقق من المعامل وفوض الطرف والمورد. افصل قيد التوجيه والإذن ولا تجعل رؤية اللغة سياسة التطبيق.
2. لماذا لا يجعل مسار require_relative الثابت المساعد صندوق عزل أمني؟
اعرض الحل المشروح
الملف المحمّل شيفرة بقدرات العملية. يضبط المسار الاختيار لا آثار التنفيذ أو الثقة. راجع المصدر والسلوك الأعلى وسياسة الاعتماد. استخدم عزلا مناسبا لغير الموثوق ولا تفترض تقييد القدرات بمساحة اسم أو تحميل محلي.
أهم ما تعلمته
- التحميل والتحليل واختيار التوجيه والتفويض حدود مختلفة.
- تحتاج ميزات Ruby المرنة عقود تطبيق ضيقة لا افتراضات خفية.