Как вы отмечаете рубиновую привязку в качестве доверенного?

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

  •  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 Уровень, см. Отличное описание в книге Кирбекса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top