我今天在应用程序中发现了一个非常奇怪的错误,我不确定如何解决它。
表格允许用户做某事。为此,它需要通过系统调用外部命令。因此,我决定为此目的使用escapeshellcmd
。
<?php
$foo = "abc&d";
$bar = "abc d";
$command = sprintf("/bin/command '%s' '%s'", $foo, $bar);
var_dump(escapeshellcmd($command)); //"/bin/command 'abc\&d' 'abc d'"
?>
这不是我想要的(请注意错误的\&
会产生多余的多余字符'\')。
因此,我想出了三种不同的解决方案,但我不知道我应该选择哪种解决方案,因为只有一种能够为我提供正确的解决方案。
<?php
$foo = "abc&d";
$bar = "abc d";
$command1 = sprintf("/bin/command %s %s", $foo, $bar);
var_dump(escapeshellcmd($command1)); //"/bin/command abc\&d abc d" <- now we have three arguments
$command2 = sprintf("/bin/command %s %s", escapeshellarg($foo), escapeshellarg($bar));
var_dump($command2); //"/bin/command 'abc&d' 'abc d'" <- correct-ish?
$command3 = sprintf("/bin/command %s %s", escapeshellarg($foo), escapeshellarg($bar));
var_dump(escapeshellcmd($command3)); //"/bin/command 'abc\&d' 'abc d'" <- extra '\'
?>
这些解决方案中的哪一个是其他首选?为什么?是否有另一个(适当)解决这个难题的方法?
答案 0 :(得分:1)
您应该使用:
$command2 = sprintf("/bin/command %s %s", escapeshellarg($foo), escapeshellarg($bar));
var_dump($command2); //"/bin/command 'abc&d' 'abc d'" <- correct-ish?
您要使用escapeshellcmd
的唯一原因是,如果要允许变量中的空格分隔参数。如果您只想使用转义符传递参数,请使用escapeshellarg
。