代码之家  ›  专栏  ›  技术社区  ›  Matt Mitchell

评估用户代码的安全问题是什么?

  •  5
  • Matt Mitchell  · 技术社区  · 16 年前

    我想知道实现 PHP evaluator 这样地:

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

    这是在做一个 PHP sandbox 所以要消毒 DB input 等等不是一个大问题。

    正在破坏承载该文件的服务器的用户是。

    我见过 Ruby simulators 所以我很好奇安全性到底涉及到什么(至少是模糊的细节)。


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

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

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

    Geoff's answer randy's answer 回应一般的观点,即您需要编写自己的评估器来实现模拟类型的功能。

    9 回复  |  直到 9 年前
        1
  •  5
  •   Paul Mitchell    16 年前

    如果你 eval() 我想要些什么

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

    这是一个极端的例子,但如果是这样的话,你的网站就会被删除。希望您的权限不允许这样做,但它有助于说明需要进行卫生处理和检查。

        2
  •  18
  •   Owen Ryan Doherty    16 年前

    不要那样做。

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

        3
  •  6
  •   A J    9 年前

    这个 eval() 功能很难被净化,即使你这样做了,也肯定会有一种解决方法。即使你过滤了 exec 你要做的就是用胶水把绳子粘住 执行程序 变成一个变量,然后做 $variable() . 你需要真正削弱语言才能达到某种假想的安全性。

        4
  •  4
  •   keparo bshirley    16 年前

    你可以说很多事情……问题是 不特定于PHP。

    以下是简单的答案:

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

    你发布的代码片段可以让用户运行他们想要的任何代码,所以它特别危险。

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

    Wikipedia on Code Injection .

        5
  •  4
  •   Rich Bradshaw    16 年前

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

        6
  •  3
  •   paan    16 年前

    亲爱的上帝 .我甚至为这个头衔而畏缩。允许用户运行任何类型的任意代码就像将服务器移交给他们一样。

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

    如果你 真的,真的吗? 希望允许用户运行某种代码。通过创建用户可以使用的某种psudo语言,使命令的一个子集对用户可用。a-la bbcode或markdown的工作方式。

        7
  •  3
  •   Geoff    16 年前

    如果你想建立一个 online PHP interpreter ,您需要创建一个 REPL 翻译,不使用eval。

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

        8
  •  2
  •   randy    16 年前

    不是 允许在服务器上执行未筛选的代码,句点。

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

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

    祝你好运!

        9
  •  -1
  •   ehm    16 年前

    正如已经回答的,您需要清理输入。我想您可以使用某种类型的regex filtring来删除不需要的命令,比如“exec”,基本上每个php必须提供的恶意命令(或者可能被利用的命令),这是非常多的。