Я кодирую веб-интерфейс к ужасному программному обеспечению, которое использует наша компания. У программного обеспечения нет реального пользовательского интерфейса и требуется, чтобы мы предоставляли шпаклеру доступ к нашей системе, чтобы наши клиенты могли даже извлекать данные. Мой веб-интерфейс должен запускать 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) . "'";
Быть безопасным!