2016-08-25 109 views
0

有沒有辦法在PHP中執行帶有參數但沒有「shell」的命令。在沒有shell的情況下使用參數執行命令php

問題是exec()shell_exec()在shell中運行提供的字符串,因此任何用戶輸入的數據都必須轉義。

有沒有辦法做到這一點,如:

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

作爲一個會做它例如Python或Java的。

我會非常能夠用參數執行命令而不必轉義一些參數。

我正在爲一個路由器的UI工作,並通過一個命令 設置Wifi密鑰,現在我必須轉義字符串限制密鑰可以包含的字符數。如果我在哪裏不逃避關鍵的人可以做任何注射沒有任何問題。

澄清 之所以這樣,其實是在這種情況下,一個惱人的問題是,我需要執行下面的命令:

[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