2010-01-23 70 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

相关问题