评估用户代码的安全问题是什么?
我想知道实现这样的" PHP评估程序"会带来什么安全问题:
<?php eval($_POST['codeInput']); %>
这是在制作" PHP沙箱"的背景下,因此针对" DB输入"等进行消毒并不是一个大问题。
用户正在破坏托管文件的服务器。
我看过" Ruby模拟器",所以我很好奇涉及安全性的方面(至少细节模糊)。
谢谢大家我什至不确定要接受哪个答案,因为它们都很有用。
Owen的答案总结了我所怀疑的(服务器本身将处于危险之中)。
阿琳的答案很好地说明了潜在的问题。
杰夫(Geoff)的答案和兰迪(兰迪)的答案与普遍的看法相呼应,即我们需要编写自己的评估器才能实现模拟类型的功能。
解决方案
不要那样做
他们基本上可以使用PHP进行任何操作(查看文件系统,获取/设置任何类型的变量,打开与其他计算机的连接以插入要运行的代码等)。
我们可能会说很多话。.这些关注点不是特定于PHP的。
这是简单的答案:
计算机(或者数据库)的所有输入都需要清理。
我们发布的代码片段几乎可以让用户运行他们想要的任何代码,因此这特别危险。
这里有一个很好的关于代码注入的介绍性文章:
Wikipedia上的代码注入。
如果我们允许在服务器上运行任意代码,则不再是服务器。
正如已经回答的那样,我们需要清理输入内容。我猜我们可以使用某种正则表达式过滤来删除不需要的命令,例如" exec",基本上删除PHP必须提供(或者可以利用)的每个恶意命令,这很多。
如果我们使用eval()可能会遇到很大的麻烦
<?php eval("shell_exec(\"rm -rf {$_SERVER['DOCUMENT_ROOT']}\");"); ?>
这是一个极端的例子,但是在这种情况下,网站只会被删除。希望许可不允许这样做,但是,它可以说明需要进行消毒和检查。
亲爱的上帝我什至不愿获得冠军头衔。允许用户运行任何种类的任意代码就像将服务器移交给他们
我知道我上面的人已经这么说了。但是相信我。从来没有足够的时间有人可以告诉我们清理输入内容。
如果我们确实要允许用户运行某种代码。通过创建某种用户可以使用的伪语言,使命令的子集对用户可用。 A-la bbcode或者markdown的工作方式。
禁止在服务器上执行未经过滤的代码。
如果我们想创建一个允许交互式演示语言的工具,例如此处显示的工具,请访问:http://tryruby.hobix.com/我将自己编写语言的一部分。理想情况下,我们将使用它向新程序员演示简单的概念,因此,如果正确实现所有功能,则与之无关。
这样,我们可以通过已知可接受输入的白名单来控制输入。如果输入不在白名单上,则不会执行。
祝你好运!
如果要构建在线PHP解释器,则需要构建实际的REPL解释器,而不使用eval。
否则,永远不要执行任意用户代码。曾经。
eval()函数很难清除,即使我们这样做了,也肯定会有解决方法。即使我们过滤了exec,我们所需要做的就是以某种方式将字符串exec粘贴到变量中,然后执行$ variable()。我们需要真正削弱语言以实现至少某种虚构的安全性。