Как мне санировать пользовательский ввод перед передачей его в% x (выполнение)? - PullRequest
3 голосов
/ 22 мая 2009

Я беру строку ввода от пользователя и использую ее в качестве параметров для фоновой программы командной строки.

Каков наилучший способ обеспечения того, чтобы этот ввод был "безопасным"? Ака, они не вставили "; cd /; rm -rf" или какое-то другое безобразие в поле?

Без всякой дезинфекции у меня есть ...

@query = params[:query]
@result = %x( mycommand #{@query} )

Мне нужно получить выходные данные команды, поэтому я не могу использовать систему («команда», «параметры»), поскольку она возвращает только true или false, но обеспечивает защиту.

Я знаю, что это опасно ... заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 22 мая 2009

Всегда, всегда определите, что вы примете, а затем отрицайте все остальное. Слишком часто люди пытаются разрешить все, а затем отрицают плохие вещи.

  1. Начните с символов. То есть если mycommand нужен только буквенно-цифровой ввод плюс пробелы только тогда позволяют тот. Там не было бы никаких шансов "rm -rf /" подкрадывается, ни другие 10000 вещей, которые требуют знаки препинания.
  2. Есть ли дальше синтаксика / семантика mycommand что вы можете использовать, чтобы определить "хорошо" вход? Таких как требуется ровно 2 Параметры, разделенные пробелом?

Не зная, что такое mycommand, я не могу предложить конкретику, но вы понимаете: не пытайтесь выбрасывать плохие вещи; определить действительный и выбросить все остальное. Обратите внимание, что это все еще сложно, но без такого подхода это почти невозможно.

3 голосов
/ 22 мая 2009

В связи с характером выполнения команд, я бы, вероятно, сказал, что вам следует использовать белый список, чтобы гарантировать выполнение только ожидаемых команд. Это кажется мне довольно опасным!

1 голос
/ 23 мая 2009

Если, как вы сказали в своем ответе на dwc, вам требуется доменное имя (я предполагаю, что вы имеете в виду полностью квалифицированный) или IP-адрес, вы можете использовать Resolv для их поиска и принимать их только при наличии соответствующего A / CNAME в случае доменного имени или PTR в случае IP.

Если они введут IP-адрес, для которого нет обратного ptr, у вас могут возникнуть проблемы. Если они введут доменное имя, для которого нет A / CNAME, скорее всего, ваша команда в любом случае потерпит неудачу.

0 голосов
/ 23 мая 2009

Другой вариант, если ваши команды ограничены, вы можете создать список в раскрывающемся списке команд и поместить аргументы в другие поля / флажки / раскрывающиеся списки. Затем подтвердите каждый аргумент, предложенный Майком.

Это не позволит любому введенному пользователем значению действительно попасть в командную строку.

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