Безопасная передача параметров команд оболочки с помощью% x [] в Ruby - PullRequest
3 голосов
/ 23 августа 2011

Скажем, у меня в контроллере Rails:

dir = params[:dir]
output = %x[ls #{dir}]

Это ОГРОМНАЯ дыра в безопасности, если кто-то отправляет dir="foo; rm -rf /"

Так что мне нужно защитить параметр.Я знаю, что могу сделать

system "ls", dir

Но этот метод не захватывает стандартный вывод!

Итак, как мне безопасно передать параметры в% x []?

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

Проблема в том, что %x() в основном передает строку в оболочку для разбора, поэтому вам придется избегать всего, что может интерпретировать оболочка. Таким образом, %x в значительной степени находится за окном, если вам нужно иметь дело с чем-то, что вы сами не создали (и событие, то это подозрительно).

Одним из решений является использование Open3.capture3 :

out, err, status = Open3.capture3('/bin/ls', dir)

, а затем обрабатывает стандартный вывод (out) и возвращает стандартную ошибку (err) при необходимости. В Open3 есть еще несколько вещей, которые могут лучше удовлетворить ваши потребности.

1 голос
/ 23 августа 2011

Вы просматривали безопасные уровни Ruby?

http://www.ruby -doc.org / docs / ProgrammingRuby / html / taint.html

Для уровней> =2 там написано: «Не могу изменять, создавать или удалять каталоги, или использовать chroot».

Раньше также был драгоценный камень песочницы, но я не уверен, что он все еще активен.Вы также можете взглянуть на источник "Try Ruby!"там должна быть какая-то песочница.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...