كيف يمكنك وضع علامة على روبي ملزمة كما هو موثوق؟
-
26-09-2019 - |
سؤال
من هذه المقالة http://www.stuartellis.eu/articles/erb في إشارة إلى مستويات سلامة الموضوع:
"في هذا المستوى ، يجب وضع علامة على الربط المحدد على أنه موثوق به لـ ERB لاستخدامه."
لقد بحثت في عالية ومنخفضة ولم أجد طريقة "لتمييز" ملزمة "موثوق بها".
هل سيقوم أحد بتنوير لي؟
المحلول
يجب تلوث الربط عن طريق الاتصال taint
طريقة.
ال $SAFE
المستويات هي ميزة من روبي تنكر بعض الإجراءات اعتمادًا على المستوى الحالي وما إذا كان الكائن ملوث. من المفترض أن تنشأ السلاسل الملوثة من مصدر غير موثوق ، مثل ملف ، قاعدة بيانات ، عميل HTTP ، إلخ.
في $SAFE
المستوى 1 ، على سبيل المثال ، لن يسمح لك روبي بذلك require
الملفات إذا كانت الوسيطة عبارة عن سلسلة ملوثة.
$SAFE
المستوى 4 هو الأكثر تطرفا. سوف لا يسمح لك روبي بفعالية لتعديل أي غير ملائمة هدف. الفكرة هي أنه يمكنك استخدام أقل $SAFE
المستوى في التطبيق الخاص بك ، وتأسيس موضوع أو proc مع $SAFE
المستوى 4. ضمن هذا صندوق الرمل, ، يمكنك تعديل ملوث الأشياء فقط.
يستخدم ERB هذه الآلية للسماح لك بتشغيل قالب داخل صندوق الرمل. إذا حاولت الحصول على نتيجة قالب تم تقديمه من ملزمة معينة ، فهذا ما يحدث:
class TemplateContext
def name; "Teflon Ted"; end
end
template_binding = TemplateContext.new.send(:binding)
ERB.new("Hi, <%= name %>!", 4).result(template_binding)
#=> SecurityError: Insecure: can't modify trusted binding
كوم! هذا هو روبي يخبرك أنه كذلك لا بأس في تعديل غير مصقول اعتراض في $SAFE
المستوى 4. لن يسمح لك بالاتصال eval
مع الربط المعطى (وهو بالضبط ما يحاول ERB).
بدلاً من ذلك ، يجب عليك تزويد صندوق الرمل بـ ملوث ربط. أنت تخبر روبي بشكل صريح أنه من الجيد استخدام هذا الربط في صندوق الرمل ، وأنه لا ينبغي الوثوق به خارج صندوق الرمل.
class TemplateContext
def name; "Teflon Ted"; end
end
# Binding must be tainted!
template_binding = TemplateContext.new.send(:binding).taint
ERB.new("Hi, <%= name %>!", 4).result(template_binding)
#=> "Hi, Teflon Ted!"
لمزيد من المعلومات حول روبي $SAFE
المستوى ، انظر وصف ممتاز في كتاب Pickaxe.