Php 使用用户插入的变量清理exec命令的最佳方法
我正在为我们公司使用的一个可怕的安抚软件编写一个web界面。该软件没有真正的用户界面,要求我们允许putty访问我们的系统,以便我们的客户甚至可以提取数据。我的web界面必须运行Php 使用用户插入的变量清理exec命令的最佳方法,php,exec,sanitize,Php,Exec,Sanitize,我正在为我们公司使用的一个可怕的安抚软件编写一个web界面。该软件没有真正的用户界面,要求我们允许putty访问我们的系统,以便我们的客户甚至可以提取数据。我的web界面必须运行exec()函数,它必须将一些变量传递给用户输入 $command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'"; $last_line = exec($command,
exec()代码>函数,它必须将一些变量传递给用户输入
$command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'";
$last_line = exec($command, $output, $returnvalue);
现在我假设我可以从$command
变量中删除任何分号,这样做是安全的,但我不确定,这就是为什么我在下个月上线之前在这里摆出这个姿势的原因
清理$command
的最佳方法是什么?在变量[]>!\$代码>使用PHP为此目的提供的函数:
$cmd =
"/usr/bin/do-something " .
escapeshellarg($arg1) .
' ' .
escapeshellarg($arg2);
您还可以使用escapeshellcmd()
有什么区别?
escapeshellarg()
仅在字符串周围添加“然后\在任何其他”字符之前添加。
escapeshellcmd()
转义所有shell敏感字符($,\,等等),但不添加引号。
当您将escapeshellarg()
用作引用参数的一部分时,就会出现这种情况。然后它就变得无用了(实际上是在混合中添加引号)
一般来说,我们更喜欢使用escapeshellcmd()
,并添加我们自己的引号
$cmd =
"/usr/bin/do-something '" .
escapeshellcmd($arg1) .
"' '" .
escapeshellcmd($arg2) .
"'";
注意安全删除了我的答案,因为显然我们是在同一时间打字,但你给出了很好的例子。指向手册的链接:,谢谢,@AC--现在添加链接只是注意escapeshellcmd()
实际上并没有转义“!”,因此,如果您在Bash中运行该命令,您仍然容易受到命令替换的攻击(例如,this-is-a-test-!467
,其中!467
将被shell历史记录中的第467号命令替换)<代码>escapeshellarg()
缓解了这种情况。这非常有帮助,我从未听说过这些命令。非常感谢你。