不要相信用户!
您首先应该注意的是“不要相信您的用户”。
如果您的“HTML”由您的服务器呈现并且用户无法修改,则完全可以。
因为你渲染/保存的 HTML 是完全安全的并且由你自己管理,如果它被确定为“安全”的 HTML,你是否将它(html)放入 DOM 根本不是问题。
但问题是,大多数 WYSIWYG 编辑器——比如draft.js——制作的“HTML”文件不是文本。我想你的担心也来自这里。
是的,这很危险。我们能做的不是直接渲染 HTML,而是“选择性”渲染 HTML。
危险标签:<script>、<img>、<link>等
您可以删除这些标签,但当您决定允许哪些标签时会更安全,如下所示:
安全标签:<H1> - <H6>/span/div/p/olulli/table...
并且您应该删除那些 HTML 元素的属性,例如 onclick="" 等。
因为它也可能被用户滥用。
结论:
那么当我们使用所见即所得的编辑器时,我们可以做什么呢?
有2大策略:
- 在对数据库安全时生成“安全”HTML。
- 在将其放入 DOM 之前生成“安全”HTML。
(3. 在将 html 发送到客户端之前生成“安全”HTML,但您的情况并非如此!)
如果您想确保数据库的文本完全安全,请选择第一个。
第一个必须在您的服务器中处理(不是浏览器/客户端!),您可以使用许多解决方案,例如 python 中的BeautifulSoup,或 nodejs 中的sanitize-html。
如果您的 Web 应用程序很复杂,并且您的服务的大部分业务逻辑都在前端运行,请选择第二个。
第二个是在将 HTML 挂载到 DOM 之前使用 HTML 转义包。仍然sanitize-html 可以是很好的解决方案。 (当然还有更多很棒的解决方案!)
您可以决定 HTML 中的哪些标签/属性/值。
链接
https://github.com/punkave/sanitize-html