Лучший способ обезопасить команду exec с введенными пользователем переменными

Я кодирую веб-интерфейс к ужасному программному обеспечению, которое использует наша компания. У программного обеспечения нет реального пользовательского интерфейса и требуется, чтобы мы предоставляли шпаклеру доступ к нашей системе, чтобы наши клиенты могли даже извлекать данные. Мой веб-интерфейс должен запускать exec(); и он должен передать несколько переменных пользовательских входов.

 $command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'"; $last_line = exec($command, $output, $returnvalue); 

Теперь я предполагаю, что я мог бы просто удалить любые точки с запятой из переменной $command и быть в безопасности, но я не уверен, и именно поэтому я представляю это здесь, прежде чем мы выйдем в следующем месяце.

Какой был бы лучший способ дезинформировать $command ? Есть несколько специальных символов, которые мне нужны, чтобы быть в переменных [ ] < > ! # $ [ ] < > ! # $ .

Related of "Лучший способ обезопасить команду exec с введенными пользователем переменными"

Используйте функцию, которую PHP имеет для этой цели:

 $cmd = "/usr/bin/do-something " . escapeshellarg($arg1) . ' ' . escapeshellarg($arg2); 

Вы также можете использовать escapeshellcmd()

Какая разница?

escapeshellarg() ТОЛЬКО добавляет «вокруг строки, а затем перед любыми другими» символами. http://www.php.net/escapeshellarg

escapeshellcmd() все символы, чувствительные к оболочке ($, \ и т. д.), но не добавляет кавычки. http://www.php.net/manual/en/function.escapeshellcmd.php

Исход в том случае, если вы используете escapeshellarg() как параметр PART OF A QUOTED. Затем он оказывается бесполезным (фактически добавляя котировки в микс).

Вообще говоря, мы предпочитаем использовать escapeshellcmd() с добавленными нашими кавычками.

 $cmd = "/usr/bin/do-something '" . escapeshellcmd($arg1) . "' '" . escapeshellcmd($arg2) . "'"; 

Быть безопасным!