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

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

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

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

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


person The Digital Ninja    schedule 11.06.2009    source источник


Ответы (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() как ЧАСТЬ параметра в кавычках. Затем он становится бесполезным (фактически добавляя к смеси кавычки).

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

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

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

person gahooa    schedule 11.06.2009
comment
Удалил мой ответ, потому что, видимо, мы печатали одновременно, но вы привели достойные примеры. Ссылки на руководство: us.php.net/manual/en/function.escapeshellarg. php, us.php.net/manual/en/function. escapeshellcmd.php - person anonymous coward; 11.06.2009
comment
Спасибо, @AC -- добавляю ссылки сейчас - person gahooa; 12.06.2009
comment
Просто обратите внимание, что escapeshellcmd() на самом деле не экранирует '!', поэтому, если вы запускаете команду, например. Bash, вы по-прежнему уязвимы для замены команд (например, this-is-a-test-!467, где !467 будет заменено тем, что имеет номер 467 в истории вашей оболочки). escapeshellarg() облегчает это. - person madsen; 24.08.2017
comment
Это было очень полезно, и я никогда не слышал об этих командах. Большое Вам спасибо. - person Andy Borgmann; 23.09.2020