这是我考虑了一段时间的事情。
我正在创建一个应用程序,我的用户将在其中上传他们自己的自定义主题,这意味着对于任何具有基本 PHP/XSS/任何技能的人来说,都会有一个很好的机会来引起很多头痛。
我想在一种沙盒、封闭的环境中运行任何上传的文件,该环境只能访问我想要的东西(变量),没有别的。
这会是一个好的做法吗?怎么做?
为了安全地允许任意 html/javascript,每个用户都必须有自己的子域。如果每个用户都有自己的子域,那么由于Same Origin Policy ,用户的 JavaScript 将被限制在他们自己的沙箱中。如果您只想允许“安全 html” ,则可以选择htmlpurifer,然后您可以使用 1 个域。
允许自定义 PHP 有点危险。“共享主机”提供商依赖suPHP,它强制 php 脚本以特定用户身份运行。这将要求每个用户在您的系统上都有自己的帐户。这种防御方法已经存在了一段时间。它并不完美,但它可以解决问题。
自定义主题的另一种可能的解决方案是使用模板引擎,它可以防止模板获得对 PHP 的完全访问权限。一些流行的框架:
由于您不想授予用户访问 PHP 的权限,因此您应该使用支持沙盒的模板引擎。Twig是一个突出的例子。
全局范围将始终可访问。
但是面向对象的概念提供了很多。你不能做的是隐藏全局的东西。你能做的不是一开始就让它可见。
但是执行未经审查的第 3 方代码是一件棘手的事情。如果可能的话,我会在这里推荐某种进程隔离。这意味着您使用 popen 或其他东西打开一个进程,结合 suphp 您可以创建一个受限的 linux 用户。如果采取了正确的安全措施,这是很有可能的并且是安全的。
在同一程序中运行代码的一个好方法是使用模板模式。对于类来说有点不切实际,因为加载了整个文件会注入危险代码。但是您可以从代码中在 php 中创建自定义函数。除非调用函数,否则代码不会被执行。您还可以将类扩展为变量名,然后是用户提供的代码。然而,这几乎是不可能做到安全的。
当涉及到 html 代码时,它更容易。有好的 html 整洁是一个好的开始。有很好的解决方案只允许使用特殊标签。
javascript 可以以旧 facebook fbml 应用程序所做的方式“保护”。其中包括服务器端重写、动态变量名等,它相当复杂。
在我看来,允许外部自定义的最佳方式是允许外部样式表。只需从外部来源加载它们,并没有真正的安全问题。
编辑:当然,您可以解析任何代码并将其限制为某些语句或拒绝某些语句,但这非常棘手,并且对于 php 来说是一个非常重的约束。切换到一些更高级别的算法语言或使用 javascript 去客户端可能会更好。
你想做的事情真的很冒险。你不应该让你的用户上传 PHP 文件。这就是为什么您在网上找不到很多 PHP 提琴手的原因(尽管现在有一些)。
此外,JS 在某些间接方面是危险的,几乎没有人允许你上传它(Tumblr 除外)。
您应该做的是采用某种模板引擎,并清理用户上传的模板,以删除脚本。
由于安全是一个问题,因此在选择模板引擎时,请尝试检查诸如Secunia之类的安全建议。