Php 使用用户插入的变量清理exec命令的最佳方法

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,

我正在为我们公司使用的一个可怕的安抚软件编写一个web界面。该软件没有真正的用户界面,要求我们允许putty访问我们的系统,以便我们的客户甚至可以提取数据。我的web界面必须运行
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()
缓解了这种情况。这非常有帮助,我从未听说过这些命令。非常感谢你。