【问题标题】:Is it safe to store and display rich text content?存储和显示富文本内容是否安全?
【发布时间】:2020-05-05 09:09:08
【问题描述】:

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

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

【问题讨论】:

  • follow the guides 使用 CKEditor 应该是对的。
  • 嗯,它说的第一件事是“不应将编辑器功能(例如高级内容过滤器 (ACF) 或粘贴过滤器)视为安全过滤器。”它还说您必须自己通过contentPreview 事件对其进行适当的清理,否则它将容易受到 XSS 的攻击。

标签: php mysql laravel security wysiwyg


【解决方案1】:

使用不同的标记(例如 Markdown)来存储用户输入的 html 是一罐蠕虫。非常复杂,并且不会自动解决您的问题(主要是 XSS)。您可以只存储经过净化的使用输入(如果您愿意,甚至可以存储原始的未经净化的用户输入,见下文)。

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

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

您是否要在将数据发送到服务器之前进行此清理取决于您的用例。您不一定需要这样做,但是您必须小心如何在其他潜在应用程序中使用该数据(例如,另一个“管理员”或“管理”应用程序可能以不安全的方式显示它 - 这不应该是情况,因为这将是另一个应用程序中的 XSS)。

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

【讨论】:

  • 哇,非常感谢您为这个完美的答案付出的所有时间,Gabor 先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多