PHP中的隔离?

时间:2011-05-02 17:41:14

标签: php security isolation

这是我一段时间以来都想过的事情  我正在创建一个应用程序,我的用户将上传他们自己的自定义主题,这意味着任何拥有基本PHP / XSS /任何技能的人都会有很好的机会引起很多麻烦。

我想在一个沙盒,封闭的环境中运行任何上传的文件,只能访问我想要的东西(变量)而没有别的东西。

这是不错的做法,如何做?

4 个答案:

答案 0 :(得分:4)

为了安全地允许任意html / javascript,每个用户必须拥有自己的子域。如果每个用户都有自己的子域,那么由于Same Origin Policy,用户的JavaScript将被限制在他们自己的沙箱中。如果您只想允许“安全html”,则htmlpurifer是一个选项,然后您可以使用1个域。

允许自定义PHP更危险。 “共享主机”提供程序依赖suPHP来强制php脚本作为特定用户运行。这将要求每个用户在您的系统上拥有自己的帐户。这种防御方法已经存在了一段时间。它并不完美,但它可以解决问题。

自定义主题的另一个可能的解决方案是使用模板引擎,它可以防止模板获得对PHP的完全访问权限。这个流行的框架:

  1. smarty,它没有最好的安全记录,但你保持最新,你可能没有问题。它必须是configured to disallow native php
  2. twig是来自Symfony Framework制造商的一个相对较新的引擎。这意味着它有一个不错的开发人员基础,因为它与Symfony一起发布,它也在野外进行了测试。 Twig不允许调用任何PHP函数,除非你专门为它们创建一个twig函数/过滤器。

答案 1 :(得分:4)

由于您不希望授予您的用户访问PHP的权限,因此您应该使用支持沙盒的模板引擎。 Twig就是一个突出的例子。

答案 2 :(得分:1)

全局范围将始终可访问。

但面向对象的概念提供了很多。你不能做的是隐藏全球的东西。你能做的就是首先让它变得可见。

但执行未经审核的第三方代码是一件棘手的事情。如果可能的话,我会在这里建议某种过程隔离。这意味着你使用popen或其他东西打开一个进程,结合suphp你可以成为一个受限制的linux用户。通过正确的安全措施,这是非常可能和安全的。

在同一程序中运行代码的好方法是使用模板模式。它有点不实用的类,因为整个文件加载,可以注入危险的代码。但你可以从代码中在php中创建自定义函数。除非调用该函数,否则代码不会被执行。您还可以将类扩展为变量名称,然后是用户提供的代码。然而,这几乎是不可能保证安全。

当谈到HTML代码时,它更容易。有良好的html整洁是一个良好的开端。有很好的解决方案只允许特殊标签。

javascript可以像旧的Facebook fbml应用程序那样“安全”。其中包括服务器端重写,动态变量名等,这非常复杂。

在我看来,允许外部自定义的最佳方法是允许外部样式表。只是从外部来源加载它们并没有真正的安全问题。

编辑:当然你可以解析任何代码并将其限制为某些语句或拒绝某些语句,但这非常棘手,对于php来说是一个非常重的约束。它可能更好地切换到一些更高级别的算法语言或使用javascript转到客户端。

答案 3 :(得分:0)

你想做的事情真的很危险。您永远不应该允许您的用户上传PHP文件。这就是为什么你没有在网上找到很多PHP小提琴手(虽然现在有一些)。

此外,JS在某些间接方面也很危险,而且几乎没有人允许您上传它(除了Tumblr之外的明显例外)。

你应该做的是采用某种模板引擎,并清理用户上传的模板,以删除脚本。

由于安全性是一个问题,因此在选择模板引擎时,请尝试检查Secunia之类的安全建议。