我有一个PHP脚本,需要执行程序,将在名称中有空格的文件上工作。大多数用于执行外部命令(例如exec())的PHP函数在命令行执行时都有一个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
发布于 2010-02-01 23:06:03
听起来这在PHP的内置函数中是不可能实现的。
发布于 2010-01-24 02:04:04
function myExec ( command, arguments )
{
exec( command + ' ' + implode( ' ', array_map( escapeshellarg, arguments ) ) );
}发布于 2010-01-24 02:26:53
Poke的答案很好--然而,他们需要运行多少个命令呢?我会考虑实现一个命令和参数的白名单-这样,你就可以非常确定它们不会注入恶意输入。类似于:
$whitelistCommandArray = array('ls' => 'ls', ...);
if (isset($whitelistCommandArray[$userSuppliedCommand]])
{
//ok its a valid command, lets parse the args next
...
}
else echo "Unsupported command";更新/编辑:
是参数的白名单可行吗?如果OP需要编辑大量文件怎么办?- Matchu
嘿,我不知道--可能是--完全取决于你的需求。
$whitelistArray = array('ls' => array('a', 'l', 'h'), ...);类似这样的工作-使用命令,然后使用它的参数数组。
https://stackoverflow.com/questions/2124091
复制相似问题