Ruby: создание песочницы eval?
В приложении My Rails есть сложные правила о том, когда на странице должно отображаться немного контента. Я решил реализовать это, написав предикаты (простые функции "да/нет" ) в Ruby и сохраняя их в db для последующего eval'ing. Это довольно просто.
Моя главная забота - безопасность: если злонамеренный кто-то определяет, как писать в db, они могут вставлять произвольный код Ruby в db, а затем "вся ваша база принадлежит нам".
Так можно ли создать, например, "песочницу" eval, которая удалит все операции ввода-вывода?
Ответы
Ответ 1
Возможно, вы захотите проверить метод "taint" и связанные с ним вещи. Это хорошая рекомендация:
http://ruby-doc.com/docs/ProgrammingRuby/html/taint.html
Несмотря на это, я не могу посоветовать вам достаточно, чтобы не хранить код и не оценивать его, это риск безопасности, которого следует избегать, и чаще всего там более простой способ решения ваших проблем.
Если вам нужно оценить сложные правила и предикаты, я бы рекомендовал механизм правил создать хороший DSL. Не использовали один в рубине, но этот выглядит хорошо для меня:
http://treetop.rubyforge.org/index.html
Приветствия
Ответ 2
Предполагая, что вы хотя бы на рубине 1.8, вы можете запустить proc на другом безопасном уровне.
def my_unsafe_function
# possible unsafe stuff
end
proc {
$SAFE = 4 # change level only inside this proc
my_unsafe_function
}.call
Однако вы должны переосмыслить, действительно ли вам нужно хранить рубиновый код в БД. Могут ли пользователи приложения изменять этот сохраненный код и почему? Если это не так, почему бы не поместить код в файлы приложения? Я не знаю вашу настройку, но она должна быть способна вывести логику из БД.
Ответ 3
вы можете сделать это с помощью песочницы, https://github.com/tario/shikashi, которая позволяет вам использовать белые списки.
кредит fooobar.com/questions/285308/...
Ответ 4
Если вы хотите удалить некоторые методы из своего объекта, вы можете проверить это:
remove_method
или undef_method