Лучший способ дезинфицировать команду exec с помощью вставленных пользователем переменных - PullRequest
15 голосов
/ 11 июня 2009

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

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

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

Каков наилучший способ очистки $command? В переменных [ ] < > ! # $.

мне нужно указать несколько специальных символов.

1 Ответ

21 голосов
/ 11 июня 2009

Используйте для этой цели функцию 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) . 
    "'";

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

...