Я кодирую веб-интерфейс к ужасному программному обеспечению, которое использует наша компания. У программного обеспечения нет реального пользовательского интерфейса и требуется, чтобы мы предоставляли шпаклеру доступ к нашей системе, чтобы наши клиенты могли даже извлекать данные. Мой веб-интерфейс должен запускать exec(); и он должен передать несколько переменных пользовательских входов.
$command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'"; $last_line = exec($command, $output, $returnvalue);
Теперь я предполагаю, что я мог бы просто удалить любые точки с запятой из переменной $command и быть в безопасности, но я не уверен, и именно поэтому я представляю это здесь, прежде чем мы выйдем в следующем месяце.
Какой был бы лучший способ дезинформировать $command ? Есть несколько специальных символов, которые мне нужны, чтобы быть в переменных [ ] < > ! # $ [ ] < > ! # $ .
Используйте функцию, которую 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) . "'";
Быть безопасным!