安全地呈现任意用户上传的内容(来自WSYWIG编辑器)

时间:2016-09-30 05:38:21

标签: ruby-on-rails security iframe xss content-security-policy

我有一个网站,允许管理员使用任意HTML(通过WSYWIG编辑器)编辑网站的一个页面的一部分,我想找到一种方法来安全地向其他用户提供这个任意HTML。

基本意图是消除任何XSS错误的可能性(即,用户将他们的cookie偷走或其他东西)。
我已经看到以下HTML标签子集不允许用户输入: iframe,框架,嵌入,样式,视频,对象等。

但是,过滤掉iFrame或样式标签对我的用例是不可行的,因为管理员需要能够上传YouTube视频并设置样式文本。

我还听说内容管理系统有时会从单独的域(例如content.mysite.com)提供用户上传的内容,这样无论代码是否因用户上传的内容而无法运行都无法窃取我的网站的cookie(例如,app.mysite.com)因为相同的原始政策。

但是,由于我的网站不是CMS,这对我来说似乎是一种夸张的解决方案,
只有一个页面的一部分(仅由管理员编辑),允许任意自定义。

那么,有没有办法解决这个问题?
在iframe中嵌入任意内容会让用户安全吗?

提前致谢!

也具有潜在的相关性:我使用的框架是Ruby on Rails。

1 个答案:

答案 0 :(得分:0)

客户端上的html编辑器根本不能直接防范XSS。正如您所说,从不同的域提供此类内容可能会降低风险,但会让位于其他问题(例如,您将如何对其他域上的用户进行身份验证和授权,以防止下载任何用户的内容)。 / p>

标签和属性的白名单验证通常也不可行。您可以拥有标签的白名单和这些标签的属性,其他任何内容都可以从html代码中删除。这个问题是html编辑器很可能想要使用style属性,并且样式易受XSS攻击,至少在旧版浏览器中是这样。编辑器通常需要能够保存链接(<a href="">),并且还容易受到XSS的攻击,例如<a href="javascript: alert(1)">

您可能采取的一种方法是实际有效的方法Google Caja。它可以从HTML,Javascript和CSS中删除所有Javascript,以便在您的页面中包含它是安全的。它还有一个用Javascript编写的客户端清理程序,可以单独使用,并可以提供足够的保护。另一个客户端清洁剂是DOMPurify。 Caja也是最好的服务器端解决方案,但安装和维护起来有点困难。它的客户端部分以及DOMPurify的安全性稍差,因为它们都在客户端上,但在很多情况下可以很好地提供足够的保护。 (请注意,DOMPurify在旧版浏览器中不起作用,并且不会清理CSS代码,这对于最近的浏览器来说是好的。)

使用这些客户端解决方案,如果用户(攻击者)足够聪明,您可以让用户使用任何注入的Javascript将任何HTML保存到数据库,但是当显示html内容时,您将以某种方式将其发送到客户端它不容易受到XSS的攻击(例如在带有text / javascript内容类型的AJAX响应中),然后在插入页面DOM之前通过浏览器中的客户端清理程序运行它(将其提供给编辑控制本身)。

如果你的编辑器允许使用正确的钩子,你也可以为任何预览功能执行此操作,在切换到预览之前清理输入的HTML。这很重要,因为虽然可以说风险较小,但如果用户可以在编辑器中注入Javascript然后在预览中运行它,而不是将其发送到服务器,那么它仍然被认为是XSS。这称为DOM XSS,这是您可能希望在客户端上进行清理的一个原因。