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

Posted

技术标签:

【中文标题】使用用户插入的变量清理 exec 命令的最佳方法【英文标题】:Best way to sanitize exec command with user inserted variables 【发布时间】:2010-11-02 05:53:38 【问题描述】:

我正在为我们公司使用的一款糟糕的宣传软件编写一个 Web 界面。该软件没有真正的用户界面,需要我们授予 putty 访问我们系统的权限,以便我们的客户甚至提取数据。我的 Web 界面必须运行 exec(); 函数,并且它必须传递一些用户输入的变量。

$command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'";
$last_line = exec($command, $output, $returnvalue); 

现在我假设我可以从 $command 变量中删除任何分号并且是安全的,但我不确定,这就是为什么我在下个月上线之前在这里摆这个姿势。

清理$command 的最佳方法是什么?我确实需要在变量 [ ] < > ! # $ 中包含一些特殊字符。

【问题讨论】:

【参考方案1】:

使用 php 为此目的提供的函数:

$cmd = 
     "/usr/bin/do-something " . 
     escapeshellarg($arg1) . 
     ' ' . 
     escapeshellarg($arg2);

你也可以使用escapeshellcmd()

有什么区别?

escapeshellarg() 仅在字符串周围添加 ',然后在任何其他 ' 字符之前添加 \。 http://www.php.net/escapeshellarg

escapeshellcmd() 转义所有 shell 敏感字符($、\ 等),但不添加引号。 http://www.php.net/manual/en/function.escapeshellcmd.php

问题在于您使用escapeshellarg() 作为引用参数的一部分。然后它变得无用(实际上是在混合中添加引号)。

一般来说,我们更喜欢使用 escapeshellcmd() 并添加我们自己的引号。

$cmd = 
    "/usr/bin/do-something '" . 
    escapeshellcmd($arg1) . 
    "' '" . 
    escapeshellcmd($arg2) . 
    "'";

注意安全!

【讨论】:

删除了我的答案,因为显然我们同时打字,但你给出了不错的例子。手册链接:us.php.net/manual/en/function.escapeshellarg.php、us.php.net/manual/en/function.escapeshellcmd.php 谢谢@AC -- 现在添加链接 请注意escapeshellcmd() 实际上并没有转义'!',所以如果你在例如运行命令Bash,您仍然容易受到命令替换的影响(例如this-is-a-test-!467,其中!467 将被替换为您的shell 历史记录中的第467 号)。 escapeshellarg() 缓解了这种情况。 这非常有用,我从未听说过这些命令。非常感谢。

以上是关于使用用户插入的变量清理 exec 命令的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

清理用户提交内容的最佳方法? [复制]

[100]shell中exec解析

Cypress web自动化35-cy.exec()执行python命令操作数据库

Cypress web自动化35-cy.exec()执行python命令操作数据库

使用不存在和插入的最佳方法是啥?

在 SQL Server 表中观察插入的最佳方法