Подтвердить что ты не робот

Ruby: создание песочницы eval?

В приложении My Rails есть сложные правила о том, когда на странице должно отображаться немного контента. Я решил реализовать это, написав предикаты (простые функции "да/нет" ) в Ruby и сохраняя их в db для последующего eval'ing. Это довольно просто.

Моя главная забота - безопасность: если злонамеренный кто-то определяет, как писать в db, они могут вставлять произвольный код Ruby в db, а затем "вся ваша база принадлежит нам".

Так можно ли создать, например, "песочницу" eval, которая удалит все операции ввода-вывода?

4b9b3361

Ответ 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

Однако вы должны переосмыслить, действительно ли вам нужно хранить рубиновый код в БД. Могут ли пользователи приложения изменять этот сохраненный код и почему? Если это не так, почему бы не поместить код в файлы приложения? Я не знаю вашу настройку, но она должна быть способна вывести логику из БД.

Ответ 4

Если вы хотите удалить некоторые методы из своего объекта, вы можете проверить это:
remove_method или undef_method