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

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

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

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

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

Ответы

Ответ 1

Используйте функцию, которую 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() как параметр ЧАСТЬ А QUOTE. Затем он становится бесполезным (на самом деле добавляет кавычки в микс).

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

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

Будьте в безопасности!