【问题标题】:Sandboxing Users' PHP Code沙盒用户的 PHP 代码
【发布时间】:2010-07-23 07:19:18
【问题描述】:

我想限制我的用户可以访问的 PHP 功能。

例如有一个对象$data,用户喜欢使用iffor和echo。

显然允许他编写 PHP 将是一个严重的漏洞。

有没有办法在沙箱中运行这个 PHP 或者你会推荐任何轻量级的 PHP 模板引擎?

【问题讨论】:

标签: php security sandbox


【解决方案1】:

如果您没有自己的服务器,您可能没有 runkit。但是你所拥有的(可能)是Tokenizer!使用 Tokenizer,您可以查看给定的源代码并在发现无效令牌时中止。 Here an example how to validate an array using this。你可以为你的目的做同样的事情。 PHP 文档有a list of tokens。如果您需要帮助决定允许或禁止哪些令牌,请说出来。

€dit:显然我也建议使用Twig。太棒了 - 并且有沙盒功能!

【讨论】:

  • Twig 有沙盒模板代码。这不如 runkit-sandbox 但我不必重新安装 php 服务器。非常感谢!
【解决方案2】:

目前我只知道runkit。

runkit 扩展提供了方法 修改常量,用户自定义 函数和用户定义的类。 它还提供自定义 超全局变量和可嵌入的 通过沙盒的子解释器。

更新:

我可以找到这两个关于 zend 和 runkit 的链接,你应该看看:

http://framework.zend.com/wiki/display/ZFPROP/Zend_Http_Server+-+Mat+Scales
http://www.dunfy.me.uk/?p=38

【讨论】:

  • Runkit 需要启用线程安全,而 Zend 需要禁用线程安全。有没有办法使用 Zend 和 Runkit?
  • The Runkit_Sandbox class is only available as of PHP 5.1.0 or specially patched versions of PHP 5.0, and requires that thread safety be enabled 在我的phpinfo() 中启用了runkit,但是可能由于线程安全而禁用了runkit_sandbox
  • @Ghommey:这就是我们目前所拥有的 :(
【解决方案3】:

按照 smarty 的思路,试试twig!

还有一个非常强大的extension system,它允许您在模板语言本身中允许/禁止内置或自定义标签、令牌解析器、节点等。通过这种方式,用户可以拥有基本逻辑(条件语句、“函数”(块)和迭代器),而无需诉诸 eval 的弊端。

【讨论】:

  • Twig 聪明地从水中吹了出来,它仍在积极开发中。
【解决方案4】:

试过Smarty吗? http://www.smarty.net/

【讨论】:

  • @Ghommey:如果您真的只想要可自定义的输出,那么这是您的选择。模板引擎比 php-sandbox 更容易维护。
【解决方案5】:

PECL runkit extension 确实提供了沙盒功能,但对于您想要做的事情来说可能有点矫枉过正

【讨论】:

    【解决方案6】:

    PHP Fat-Free Framework 有一个模板引擎,它禁止使用 PHP 代码,并允许您定义哪些函数可以在 HTML 模板中使用。

    还有一个真正的沙盒功能,使函数和包含文件独立于其他文件,即一个包含文件中的变量/函数不为其他人所知,因此您可以拥有与另一个包含文件同名的函数。这可能对(功能失调的)开发团队有用。

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 2012-03-29
      • 2013-04-15
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2017-04-20
      相关资源
      最近更新 更多