Ruby: создание песочницы eval? - PullRequest
21 голосов
/ 20 мая 2011

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

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

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

Ответы [ 4 ]

6 голосов
/ 24 декабря 2012

Вы можете сделать это с самоцветом для песочницы, https://github.com/tario/shikashi,, который позволяет использовать методы белого списка.
кредит до https://stackoverflow.com/a/8704768/188355

6 голосов
/ 20 мая 2011

Возможно, вы захотите проверить метод taint и связанные с ним вещи. Это хорошая ссылка:

http://ruby -doc.com / документы / ProgrammingRuby / html / taint.html

Несмотря на это, я не могу достаточно советовать вам не хранить и не оценивать код, это риск для безопасности, которого следует избегать, и в большинстве случаев есть более простой способ решения ваших проблем.

Если вам нужно оценить сложные правила и предикаты, я бы порекомендовал механизм правил для создания хорошего DSL. Не использовал один в ruby, но этот выглядит хорошо для меня:

http://treetop.rubyforge.org/index.html

Приветствия

5 голосов
/ 20 мая 2011

Предполагая, что вы используете хотя бы ruby ​​1.8, вы можете запустить процесс на другом безопасном уровне.

def my_unsafe_function
  # possible unsafe stuff
end

proc {
  $SAFE = 4  # change level only inside this proc
  my_unsafe_function
}.call

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

0 голосов
/ 20 мая 2011

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

...