كيف يمكنك وضع علامة على روبي ملزمة كما هو موثوق؟

StackOverflow https://stackoverflow.com/questions/3619516

  •  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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top