存储和显示富文本内容是否安全?

Is it safe to store and display rich text content?

如果我使用的框架在存储到 DB 和 XSS 时会转义输入,正确使用时会自动清理输出(只允许几个标签),

只存储由CKEditor等所见即所得的编辑器创建的内容,然后将它们显示在网站上是否安全?或者最好使用某种 Markdown 语言?

使用不同的标记(例如 Markdown)来存储用户输入的 html 是一种蠕虫病毒。很多复杂性,并且不会自动解决您的问题(主要是 XSS)。您可以只存储经过清理的已用输入(如果您愿意,甚至可以存储原始的未经清理的用户输入,请参见下文)。

重点是,在将用户输入添加到页面 DOM 之前的某个时刻,您需要删除 Javascript。由于这些编辑器往往具有根本不向服务器发送数据的预览功能,通常最好通过编辑器提供的挂钩在客户端删除 javascript,在 javascript 中。在 CKEditor 的情况下,一个这样的钩子似乎是 contentPreview 事件(虽然我对 CKEditor 不是很熟悉)。

所以你应该有一个 javascript 库,它接受一堆 html 代码(你的编辑器的输出),和 returns 相同的 html,但是删除任何 Javascript。 Google Caja 有这样一个客户端html sanitizer 组件,还有其他这样的库。这应该是 运行 预览(之前),因此在实际查看内容之前删除所有 javascript。在显示从服务器接收的内容之前也应该做同样的事情(无论存储经过清理还是未经过清理的数据)。

是否要在将数据发送到服务器之前执行此清理取决于您的用例。你并不严格需要,但是你必须小心你如何在其他潜在的应用程序中使用该数据(例如另一个 "admin" 或 "management" 应用程序可能以不安全的方式显示它 - 这不应该是这种情况,因为这将是另一个应用程序中的 XSS。

另请注意,即使删除所有 javascript,用户输入的 html 仍可能存在其他潜在漏洞。例如,能够嵌入带有指向另一个站点的源的图像可能允许攻击者跟踪应用程序页面的使用情况。能够 link 到外部站点可能允许攻击者执行网络钓鱼攻击等。这取决于您的确切用例和威胁模型,并且 none 只有清理才能防止这种情况。