【问题标题】:What are the security concerns of evaluating user code?评估用户代码的安全问题是什么?
【发布时间】:2008-09-25 07:22:30
【问题描述】:

我想知道像这样实现PHP evaluator 有什么安全问题:

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

这是在制作PHP sandbox 的背景下,因此对DB input 等进行消毒并不是一个大问题。

用户正在销毁文件所在的服务器。

我见过Ruby simulators,所以我很好奇安全方面涉及什么(至少细节模糊)。


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

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

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

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

【问题讨论】:

    标签: php security


    【解决方案1】:

    不要那样做。

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

    【讨论】:

    • 是的,我想知道他们会有什么样的文件访问权限。这就是问题所在。谢谢。
    【解决方案2】:

    eval() 函数很难清理,即使你这样做了,也肯定有办法绕过它。即使您过滤了exec,您所需要做的就是以某种方式将字符串exec 粘合到一个变量中,然后执行$variable()。您需要真正削弱语言才能实现至少某种想象中的安全性。

    【讨论】:

      【解决方案3】:

      如果你eval()'d 之类的东西,可能会遇到很大的麻烦

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

      这是一个极端的例子,但那样的话您的网站就会被删除。希望您的权限不允许这样做,但它有助于说明清理和检查的必要性。

      【讨论】:

        【解决方案4】:

        您可以说很多话。这些问题并非特定于 PHP。

        这是简单的答案:

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

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

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

        Wikipedia on Code Injection.

        【讨论】:

        • 我非常担心的不是代码注入——我希望人们能够评估自己的代码。我更担心他们是否可以访问我的服务器或其他东西。
        • 啊。好吧,您原始问题中的 sn-p 不是要走的路。如果你的用户要编写代码,你可以编写一个交互式顶层,限制你实现的功能,给每个用户一个你管理的 UNIX 帐户,或者最简单的:让他们在自己的机器上运行代码。
        【解决方案5】:

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

        【讨论】:

        • 公平地说,任何关于在测试平台模拟器中隐约涉及的内容的任何想法。我看过在线 Ruby 评估者,我只是好奇。
        【解决方案6】:

        亲爱的上帝。我什至对标题感到畏缩。允许用户运行任何类型的任意代码就像将服务器交给他们

        我知道我上面的人已经说过了。但相信我。有人可以告诉您清理您的输入的次数永远不够。

        如果您真的,真的想要允许用户运行某种代码。通过创建用户可以用来执行此操作的某种伪语言,使用户可以使用命令的子集。 A-la bbcode 或 markdown 的工作方式。

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

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

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

            祝你好运!

            【讨论】:

              【解决方案9】:

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

              【讨论】:

              • 不要使用黑名单进行消毒!始终使用白名单。
              • 我认为刘易斯的评论不能被过分强调 - 如果你试图“清理你的输入” - 使用黑名单,例如正则表达式 - 在这种情况下,它几乎没用 - 我将轻松绕过您尝试实现的任何正则表达式,并且无论如何都可以轻松运行我的代码。
              猜你喜欢
              • 2012-10-25
              • 2011-10-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-26
              • 1970-01-01
              • 2016-11-20
              相关资源
              最近更新 更多