【问题标题】:This exec() is secure?这个 exec() 是安全的吗?
【发布时间】:2014-06-06 01:09:42
【问题描述】:

我有这个代码:

$cmd = escapeshellcmd($_GET['command']);
$cmd2 = escapeshellcmd($_GET['command2']);
exec("program" . $cmd . $cmd2);

我想知道允许任何人使用 html 表单是否安全?

【问题讨论】:

  • 我们不知道program 做了什么。
  • 是一个不会对系统产生影响的工具(imapsync)
  • 我对此知之甚少,但这似乎很不安全。我说&& touch myprog.sh && echo "my program code" >> myprog.sh怎么样?
  • 是因为我使用了escapeshellcmd()
  • 你正在执行"program$cmd$cmd2",而不是"program $cmd $cmd2"。如果你不得不问,那可能是不安全的。

标签: php security


【解决方案1】:

,不要让使用escapeshellcmdescapeshellarg 给你一种虚假的安全感。将值直接传递到命令行甚至转义没有任何形式的验证是自找麻烦。

如果您坚持,我建议您阅读以下讨论:

What's the difference between escapeshellarg and escapeshellcmd?

【讨论】:

  • +1 表示严格的 NO。 OP,您应该始终明确地将参数列入白名单。
  • 好的,谢谢。你有什么想法来保护这部分代码吗?
  • @skyice Benjamin 刚刚告诉你:将允许的参数列入白名单
  • @skyice 你也应该阅读我发布的链接以获得建议
【解决方案2】:

您需要将允许的命令列入白名单。

$cmd = escapeshellcmd($_GET['command']);
$cmd2 = escapeshellcmd($_GET['command2']);
$allowed_cmds = array('ls', 'foo', ...);

if(in_array($cmd, $allowed_cmds)) {
    if(in_array($cmd2, $allowed_cmds)) {
        exec("program" . $cmd . $cmd2);
    }
}

但就个人而言,你做错了什么。我已经编写了套接字系统、网站、数据库抽象、语言处理库、电子邮件服务器、正则表达式解析器以及一整套其他东西。

我从不需要讨厌的、缓慢的exec

【讨论】:

  • 您可能打算使用escapeshellarg,并且您需要在 exec 中添加空格。很明显你没有经常使用它。 :)
  • @DaniëlW.Crompton,这就是我作弊的结果。我只是复制了 OP 的代码并输入了条件。我吸取了教训。
猜你喜欢
  • 2014-11-27
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多