从php执行命令的安全性

时间:2010-05-04 10:00:55

标签: php security exec

我正在编写一个Web应用程序,其中我使用几个第三方命令在PHP中使用exec函数调用它们(例如,我通过命令行程序渲染Latex公式)。

我的问题是:在php中执行外部命令行程序有哪些安全问题?我需要注意什么?你能给我一个要检查的要点清单吗?

编辑:我知道我必须清理用户输入以防止执行任意命令......还有其他要检查的事情吗?

提前致谢。

7 个答案:

答案 0 :(得分:3)

小心使用escapeshellarg()转义您可能放入命令的任何传入数据。

使用所选可执行文件的绝对路径可以最大限度地降低PHP脚本调用错误文件的风险。

除此之外,我没有看到其他一些答案中的大惊小怪 - 毕竟,你不是在谈论让用户执行任意命令。 (如果我错了,请纠正我。)通常,从PHP执行外部命令是一种非常好的安全性IMO实践。

您需要记住,您调用的程序正在运行PHP用户的权限,并且可能不允许执行所有操作,但我认为您已经知道了。

答案 1 :(得分:2)

你必须注意这些事情:

  • 非固定命令,即应该提供命令,用户输入应该只是参数,如果有的话。
  • 欺骗命令执行其他命令的参数。分号+命令名称可能是它的候选者。
  • 逃脱将欺骗执行其他命令的字符。
  • 用户上传的内容将使命令直接(通过某些模板,包含或链接机制)或通过被调用命令中的安全漏洞(内存泄漏,堆栈溢出等)间接执行其他命令。
  • 参数中的相对路径。始终尝试将它们转换为绝对路径,并与允许路径列表进行比较。

针对攻击的安全机制是:

  • 严格将命令,参数和文件/路径名列入白名单。
  • 以非常少的权限以特定用户身份运行命令。
  • 在chroot监狱中沙箱化命令。

答案 2 :(得分:0)

如果允许其他人在基本路径中安装程序,您可能会发现自己没有执行预期的操作。

请注意,您使用自己的权限执行这些程序,因此如果它们以某种方式更改,您的帐户可能会受到损害。

答案 3 :(得分:0)

如何使用不清理用户输入,以便他们可以执行他们喜欢的任何命令...例如格式; - )

答案 4 :(得分:0)

最大的担忧是你几乎可以执行任何系统命令。因此,您至少需要确保用户提供的任何输入以及exec命令中使用的输入都已正确转义和验证。

这篇文章有一个很好的解释:

http://onlamp.com/pub/a/php/2003/08/28/php_foundations.html

答案 5 :(得分:0)

对于exec来说,验证输入被极度低估了。有很多可能滥用这些你无法想象的命令(基本的例子,你有关于过滤管道和重定向吗?)。

我建议在某个安全沙箱中运行exec中的命令,以便您的操作系统不可见。但是,请记住,这很难,因为PHP将在您的操作系统中运行。

答案 6 :(得分:0)

我强烈建议逃跑。在命令行上转储不受信任的数据有点冒险。使用固定参数启动外部程序并将数据传递给它会好得多。您可能还需要拥有比您想要的更多的PHP解释器权限,或者让程序设置为whatsit-bit,这对我来说都不是特别有吸引力。