使用用户插入的变量清理 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 命令的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
Cypress web自动化35-cy.exec()执行python命令操作数据库