escapeshellcmd和escapeshellarg的组合

时间:2018-07-24 11:24:53

标签: php

我今天在应用程序中发现了一个非常奇怪的错误,我不确定如何解决它。

表格允许用户做某事。为此,它需要通过系统调用外部命令。因此,我决定为此目的使用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 '\'
?>

这些解决方案中的哪一个是其他首选?为什么?是否有另一个(适当)解决这个难题的方法?

1 个答案:

答案 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