沙盒化用户的PHP代码

6

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

例如,有一个对象$data,用户想使用ifforecho

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

有没有办法在沙盒中运行这个PHP代码,或者您推荐使用任何轻量级的PHP模板引擎?


请参见:https://dev59.com/Z3RC5IYBdhLWcg3wW_pk - troelskn
6个回答

8
如果您没有自己的服务器,您可能没有runkit。但是您可能有Tokenizer!使用Tokenizer,您可以查看给定源代码并在找到无效标记时中止。 这里有一个使用此功能验证数组的示例。您也可以为您的目的做同样的事情。 PHP文档中有标记列表。如果您需要帮助决定允许或禁止哪些标记,请告诉我。
编辑:显然,我也建议使用Twig。它非常好用 - 并且具有沙盒功能!

Twig有沙盒模板代码。这不如runkit-sandbox好,但我不必重新安装PHP服务器。非常感谢! - jantimon

4

Runkit需要启用线程安全,而Zend需要禁用线程安全。有没有办法同时使用Zend和Runkit? - jantimon
Runkit_Sandbox类仅适用于PHP 5.1.0或特别修补的PHP 5.0版本,并且需要启用线程安全。在我的phpinfo()中,runkit已启用,但runkit_sandbox已禁用,可能是因为线程安全未启用。 - jantimon
@Ghommey:这是我们目前为止的成果 :( - Sarfraz

4

如果您熟悉Smarty,可以尝试使用Twig

此外,Twig还有一个非常强大的扩展系统,允许您在模板语言中启用/禁用内置或自定义的标签、令牌解析器、节点等。这样一来,用户就能够拥有基本的逻辑(条件语句、“函数”(块)和迭代器),而不必诉诸于eval之类的邪恶方法。


Twig比Smarty更加出色,而且它仍在积极开发中。 - Kendall Hopkins

2

@Ghommey:如果您真的只想要可定制的输出,那么这是您的选择。模板引擎比PHP沙盒更容易维护。 - Baju

1

PECL runkit 扩展 提供了沙盒功能,但对于您想要做的事情可能有些过度。


1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接