【问题标题】:Best way to sanitize exec command with user inserted variables使用用户插入的变量清理 exec 命令的最佳方法
【发布时间】: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 的最佳方法是什么?我确实需要在变量 [ ] < > ! # $ 中包含一些特殊字符。

【问题讨论】:

    标签: php exec sanitize


    【解决方案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.phpus.php.net/manual/en/function.escapeshellcmd.php
    • 谢谢@AC -- 现在添加链接
    • 请注意escapeshellcmd() 实际上并没有转义'!',所以如果你在例如运行命令Bash,您仍然容易受到命令替换的影响(例如this-is-a-test-!467,其中!467 将被替换为您的shell 历史记录中的第467 号)。 escapeshellarg() 缓解了这种情况。
    • 这非常有用,我从未听说过这些命令。非常感谢。
    猜你喜欢
    • 2010-10-15
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2021-12-16
    • 2011-08-16
    相关资源
    最近更新 更多