2010-01-23 69 views
2

我有一個PHP腳本需要執行程序,該程序可以處理名稱中有空格的文件。大多數用於執行外部命令的PHP函數(例如exec())需要1個字符串參數才能執行命令行。但是,您必須執行諸如escapeshellarg()之類的操作才能確保您的輸入安全。通過傳遞數組來執行外部命令,文件名中有空格

有什麼方法可以在PHP中用數組執行外部命令。因此,而不是:

exec("ls -l ".escapeshellarg($filename)); 

我可以去:

exec(array("ls", "-l", $filename)); 

這意味着我不必擔心逃避爭論。我想避免使用escapeshellarg(),因爲我使用的版本有一個刪除非ASCII字符的錯誤。

Java有此功能http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String[]%29

+1

我知道這很明顯,但對於任何其他人來說:從不根據用戶輸入運行外部命令。如果該腳本不在任何Web服務器上,那麼很好,但除此之外,請確保您檢查,仔細檢查並再次檢查5次,以致任何人都無法使用此腳本執行任何不應該執行的命令。 – Matchu 2010-01-23 18:05:46

回答

2

PHP的內置函數不可能有這樣的聲音。

+0

您仍然可以使用pcntl_fork/pcntl_exec函數的組合。 Hovewer爲了獲得程序的輸出,你必須處理臨時文件,因爲(聽起來像)沒有管道(2)功能:) – alvelcom 2014-12-22 20:43:18

1
function myExec (command, arguments) 
{ 
    exec(command + ' ' + implode(' ', array_map(escapeshellarg, arguments))); 
} 
+0

好的建議,但我想避免使用escapeshellarg()(我已經更新了相應的問題)。我使用的版本有一個刪除非ASCII字符的錯誤。 – Rory 2010-01-23 18:16:34

+0

隨意用任何其他函數(例如自己定義的函數)替換該函數,以正確地過濾字符。我只是想給你一個想法如何去做:) – poke 2010-01-24 19:37:38

+0

爲什麼downvote btw? – poke 2010-01-24 19:39:04

-1

打個招呼的回答是不錯的 - 但是,有多少命令他們需要運行?我會考慮實施一個白名單的命令和參數 - 這樣,你可以確信他們不是注入惡意輸入。喜歡的東西:

$whitelistCommandArray = array('ls' => 'ls', ...); 
if (isset($whitelistCommandArray[$userSuppliedCommand]]) 
{ 
    //ok its a valid command, lets parse the args next 
    ... 
} 
else echo "Unsupported command"; 

更新/編輯:

是參數的白名單中是否可行? 如果OP需要編輯多個文件 會怎麼樣? - Matchu

heh我不知道 - 它可能是 - 完全取決於您的需求。

$whitelistArray = array('ls' => array('a', 'l', 'h'), ...); 

類似那樣的工作 - 既有命令又有它的一組參數。

+0

是否可行的白名單?如果OP需要編輯大量文件會怎麼樣? – Matchu 2010-01-23 18:55:48

+0

是的,我確實需要這個腳本來運行數以千計的文件,這些文件可以被命名爲任何東西,並且幾乎肯定會在其名稱中包含空格。 – Rory 2010-01-24 12:20:35

相關問題