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

5

我想知道实现像这样的 PHP 解释器 会有哪些安全问题:

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

这是在制作一个 PHP沙盒 的情况下,因此对于 数据库输入 等进行消毒并不是一个重大问题。

用户破坏托管文件的服务器才是问题所在。

我看过 Ruby模拟器,因此我很好奇安全方面涉及哪些内容(至少是模糊的细节)。


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

Owen的答案总结了我怀疑的内容(服务器本身会处于风险之中)。

arin的答案给出了潜在问题的一个很好的例子。

Geoff的答案randy的答案都反映了一个普遍意见,即您需要编写自己的评估器才能实现模拟类型的功能。

9个回答

18

不要这样做。

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


是的,我在想他们会有什么样的文件访问权限。那就是问题所在。谢谢。 - Matt Mitchell

6

eval()函数很难进行净化,即使你这样做了,也肯定会有绕开它的方法。即使你过滤了exec,只需要将字符串exec粘贴到变量中,然后执行$variable()就可以了。你需要真正地破坏语言才能实现至少某种虚拟的安全性。


5

如果您使用eval()执行以下代码,可能会遇到一些大麻烦:

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

这只是一个极端的例子,但在这种情况下,您的网站将被删除。希望您的权限不允许,但这有助于说明需要进行清洗和检查。


4

有很多事情可以说... 这些问题与PHP无关。

这里是简单的答案:

您机器(或数据库)接收的任何输入都需要进行净化处理。

您发布的代码片段基本上允许用户运行他们想要的任何代码,因此特别危险。

这里有一篇非常好的介绍性文章,介绍了代码注入:

维基百科上的代码注入.


我并不太担心代码注入的问题 - 我希望人们能够评估自己的代码。我更担心的是,如果他们能够访问我的服务器或其他什么东西。 - Matt Mitchell
啊,好吧,你原来问题中的代码片段不是正确的方法。如果你的用户要编写代码,你可以编写一个交互式顶层,限制你实现的功能,给每个用户一个UNIX账户,由你管理,或者最简单的方法:让他们在自己的机器上运行代码。 - keparo

4
如果您允许在服务器上运行任意代码,那么它就不再是您的服务器了。

很好,对于测试模拟器大概需要涉及哪些方面有何想法?我看过在线的Ruby评估器,只是好奇而已。 - Matt Mitchell

3
亲爱的上帝,绝对不行。即使是标题我都感到不安。允许用户运行任何形式的任意代码就像把服务器交给了他们一样。
我知道我上面的人已经说过了。但相信我。没有人能告诉你要净化输入的次数太多。
如果您真的非常想允许用户运行某种类型的代码,请通过创建某种伪语言来使用户可以使用一些命令的子集来完成。这是类似于bbcode或markdown的方式。

3
如果你想构建一个在线PHP解释器,你需要构建一个真正的REPL解释器而不是使用eval。
否则,永远不要执行任意用户代码。永远不要。

2

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

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

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

祝您好运!


-1

如已经回答的那样,您需要对输入进行清理。我猜您可以使用某种正则表达式过滤来删除不需要的命令,例如 "exec" 和基本上 PHP 可以提供(或可能被利用)的每个恶意命令,而这是很多的。


2
不要使用黑名单进行清理!始终使用白名单。 - Lewis
我认为Lewis的评论不能过分强调 - 如果您尝试使用黑名单(例如正则表达式)来“清理输入”,在这种情况下,它几乎没有用处 - 我将轻松地绕过您尝试实现的任何正则表达式,并且无论如何都可以轻松运行我的代码。 - AviD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接