2016-08-25 2 views
0

Есть ли способ в php для выполнения команды с аргументами, но без «оболочки».Выполнение команды с параметрами без оболочки в php

Проблема заключается в том, что и exec(), и shell_exec() запускают поставляемую строку в оболочке, и поэтому любые введенные пользователем данные должны быть экранированы.

Есть ли способ сделать это нравится:

some_exec(["command","argument","argument]) 

Как можно было бы сделать это, например, в Python или Java.

Я бы очень мог выполнять команды с аргументами, не избегая некоторых аргументов.

Я работаю над пользовательским интерфейсом для маршрутизатора, а ключ Wifi устанавливается через команду , и прямо сейчас мне нужно избежать строки, которая ограничивает количество символов, которые может содержать ключ. Если i, где не избежать ключа, можно было бы делать инъекции без каких-либо проблем.

Разъяснение Причина, почему это на самом деле раздражает проблема в данном случае является то, что мне нужно выполнить следующую команду:

[email protected][0].key='<the password>' 

Проблема в том, что, так как пароль установлен в строка этого пароля, $il|\|t станет \$ile\|\\\|t, и проблема в том, что неправильный пароль является допустимым. И поэтому пароль, который был сохранен, не совпадает с введенным пользователем.

И даже если мы вводим пароль в строке мы все еще можем сделать инъецировать как этот ' ; reboot ; '

+0

Только уточните по следующей ссылке [ссылка] http://php.net/manual/en/function.exec.php [/ link] – sam

ответ

0

У меня есть некоторые проблемы с пониманием ваших потребностей не избежать аргументов. Я попытался вызвать эхо с беглого строкой, и эхо отображает исходную строку:

$cmd = 'echo'; 
$passwd = escapeshellarg('&#;`|*?~<>^()[]{}$'); 
echo 'ARG : ' . $passwd . PHP_EOL; 

exec($cmd . ' ' . $passwd, $output); 
echo 'exec : ' . $output[0] . PHP_EOL; 

echo 'passthru : '; 
passthru($cmd . ' ' . $passwd); 

echo 'shell_exec : ' . shell_exec($cmd . ' ' . $passwd); 

echo 'system : '; 
system($cmd . ' ' . $passwd); 

Вот результат:

ARG : '&#;`|*?~<>^()[]{}$' 
exec : &#;`|*?~<>^()[]{}$ 
passthru : &#;`|*?~<>^()[]{}$ 
shell_exec : &#;`|*?~<>^()[]{}$ 
system : &#;`|*?~<>^()[]{}$ 

Не могли бы вы привести пример команды, которую вы хотите выполнить?

+0

Мне нужно выполнить это: 'uci set wireless.radio [0] = '<пароль>' '. Если пользователь хочет пароль '$ ile | \ | t", это будет экранировано: '\ $ ile \ | \\\ | t' Проблема в том, что, поскольку в строке она устанавливается, как она есть но я все еще могу сделать инъекцию, предоставив пароль, который является ''; reboot; '' –

+0

$ cmd = 'uci set wireless.radio [0] ='; $ passwd = escapeshellarg ('$ ile | \ | t «'); $ fullCommand = $ cmd. $ Passwd; предоставляет следующий выход: uci set wireless.radio [0] = '$ ile | \ | t "', который выглядит нормально – vincenth

Смежные вопросы