评估用户代码有哪些安全问题?

时间:2008-09-25 07:22:31

标签: php security

我想知道实施PHP evaluator这样的安全问题是什么:

<?php eval($_POST['codeInput']); %>

这是在PHP sandbox如此消毒DB input等方面,这不是一个大问题。

销毁托管文件的服务器的用户是。

我见过Ruby simulators所以我很好奇安全方面的内容(至少模糊的细节)。


谢谢大家。我甚至不确定接受哪个答案,因为它们都很有用。

Owen's answer总结了我怀疑的内容(服务器本身会有风险)。

arin's answer给出了潜在问题的一个很好的例子。

Geoff's answerrandy's answer回应了您需要编写自己的评估程序以实现模拟类型功能的一般意见。

9 个答案:

答案 0 :(得分:18)

不要这样做。

他们基本上可以访问你在PHP中可以做的任何事情(查看文件系统,获取/设置任何类型的变量,打开与其他机器的连接以插入要运行的代码等等)

答案 1 :(得分:6)

eval()功能难以消毒,即使你做到了,肯定会有办法解决它。即使您过滤了exec,您只需要以某种方式将字符串exec粘贴到变量中,然后执行$variable()。你需要真正削弱语言才能达到至少某种想象的安全性。

答案 2 :(得分:5)

如果你eval()喜欢

,那么

可能会遇到很大麻烦

<?php
   eval("shell_exec(\"rm -rf {$_SERVER['DOCUMENT_ROOT']}\");");
?>

这是一个极端的例子但是在这种情况下你的网站会被删除。希望你的权限不允许它,但它有助于说明消毒的必要性和检查。

答案 3 :(得分:4)

你可以说很多事情。这些问题并非特定于PHP。

这是一个简单的答案:

您的机器(或数据库)的任何输入都需要进行清理。

您发布的代码片段几乎让用户可以运行他们想要的任何代码,因此它特别危险。

这里有关于代码注入的很好的介绍性文章:

Wikipedia on Code Injection

答案 4 :(得分:4)

如果允许在服务器上运行任意代码,则不再是您的服务器。

答案 5 :(得分:3)

亲爱的上帝。我甚至在冠军头衔都很畏缩。允许用户运行任何类型的任意代码就像将服务器交给他们一样

我知道我上面的人已经说过了。但请相信我。从来没有足够的时间让别人告诉你清理你的输入。

如果你真的,那么希望允许用户运行某种代码。通过创建某种用户可用来执行此操作的psudo语言,为用户提供可用命令的子集。 A-la bbcode或markdown的工作方式。

答案 6 :(得分:3)

如果您要构建online PHP interpreter,则需要构建一个实际的REPL解释器,而不是使用eval。

否则,永远不要执行任意用户代码。永远。

答案 7 :(得分:2)

NOT 允许在您的服务器上执行未经过滤的代码。

如果您想创建一个允许交互演示语言的工具,例如此处所见的工具:http://tryruby.hobix.com/我会自己编写语言的子部分。理想情况下,您将使用它向新程序员演示简单的概念,因此如果您正确实现所有功能则无关紧要。

通过这样做,您可以通过已知可接受输入的白名单来控制输入。如果输入不在白名单上,则不会执行。

祝你好运!

答案 8 :(得分:-1)

如前所述,您需要清理输入。我想你可以使用某种类型的regex-filtring来删除不需要的命令,例如“exec”,基本上是PHP提供的所有恶意命令(或者可能被利用的),这就是很多。