Как вы отмечаете рубиновую привязку в качестве доверенного?
-
26-09-2019 - |
Вопрос
Из этой статьи http://www.stuartellis.eu/articles erb. Ссылаясь на уровни безопасности потоков:
На этом уровне указанное связывание должно быть помечено как доверенное для ERB для его использования ».
Я искал высоко и низко и не нашел способ «отметить» привязку как «доверенный».
Будет кто-нибудь, пожалуйста, просветите меня?
Решение
Вам следует осторожность Привязка, вызывая taint
метод.
То $SAFE
уровни являются особенностью Ruby, которая отрицает определенные действия в зависимости от текущего уровня и является ли объект испорченный. Отказ Предполагается, что испорченные строки происходят из ненадежного источника, такого как файл, база данных, HTTP-клиент и т. Д.
В $SAFE
Уровень 1, например, Ruby не позволит вам require
Файлы, если аргумент является испорченной строкой.
$SAFE
Уровень 4 - самый экстремальный. Ruby эффективно запретит вас изменить Любой незван объект. Идея состоит в том, что вы можете использовать ниже $SAFE
Уровень в вашем приложении, а также создать резюме или составлять $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).
Вместо этого вы должны предоставить песочницу с помощью испорченный Привязка. Вы явно рассказываете Ruby, что все в порядке, чтобы использовать это привязку в песочнице, и что его нельзя доверять за пределами песочницы.
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!"
Для получения дополнительной информации о Ruby's $SAFE
Уровень, см. Отличное описание в книге Кирбекса.