【发布时间】:2010-07-23 07:19:18
【问题描述】:
我想限制我的用户可以访问的 PHP 功能。
例如有一个对象$data,用户喜欢使用iffor和echo。
显然允许他编写 PHP 将是一个严重的漏洞。
有没有办法在沙箱中运行这个 PHP 或者你会推荐任何轻量级的 PHP 模板引擎?
【问题讨论】:
我想限制我的用户可以访问的 PHP 功能。
例如有一个对象$data,用户喜欢使用iffor和echo。
显然允许他编写 PHP 将是一个严重的漏洞。
有没有办法在沙箱中运行这个 PHP 或者你会推荐任何轻量级的 PHP 模板引擎?
【问题讨论】:
如果您没有自己的服务器,您可能没有 runkit。但是你所拥有的(可能)是Tokenizer!使用 Tokenizer,您可以查看给定的源代码并在发现无效令牌时中止。 Here an example how to validate an array using this。你可以为你的目的做同样的事情。 PHP 文档有a list of tokens。如果您需要帮助决定允许或禁止哪些令牌,请说出来。
€dit:显然我也建议使用Twig。太棒了 - 并且有沙盒功能!
【讨论】:
目前我只知道runkit。
runkit 扩展提供了方法 修改常量,用户自定义 函数和用户定义的类。 它还提供自定义 超全局变量和可嵌入的 通过沙盒的子解释器。
更新:
我可以找到这两个关于 zend 和 runkit 的链接,你应该看看:
http://framework.zend.com/wiki/display/ZFPROP/Zend_Http_Server+-+Mat+Scales
http://www.dunfy.me.uk/?p=38
【讨论】:
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
按照 smarty 的思路,试试twig!
还有一个非常强大的extension system,它允许您在模板语言本身中允许/禁止内置或自定义标签、令牌解析器、节点等。通过这种方式,用户可以拥有基本逻辑(条件语句、“函数”(块)和迭代器),而无需诉诸 eval 的弊端。
【讨论】:
试过Smarty吗? http://www.smarty.net/
【讨论】:
PECL runkit extension 确实提供了沙盒功能,但对于您想要做的事情来说可能有点矫枉过正
【讨论】:
PHP Fat-Free Framework 有一个模板引擎,它禁止使用 PHP 代码,并允许您定义哪些函数可以在 HTML 模板中使用。
还有一个真正的沙盒功能,使函数和包含文件独立于其他文件,即一个包含文件中的变量/函数不为其他人所知,因此您可以拥有与另一个包含文件同名的函数。这可能对(功能失调的)开发团队有用。
【讨论】: