问题描述
我们有一个包含 HTML 代码的数据库,我们正在使用 React 在网页上显示它,但需要对其进行解析。
我最初使用 html-react-parser,但在代码审查后被要求使用 dangerouslySetInnerHtml,因为它没有任何依赖项。
除了不使用危险的SetInnerHtml之外,我无法阐明使用html-react-parser的任何优势,但这是一个优势,如果是这样,为什么?它是否以某种方式避免了危险,还是只是隐藏了危险?
非常感谢,
凯蒂
解决方法
我最近一直在为我正在处理的 Headless CMS 项目研究这个问题。据我了解:
dangerouslySetInnerHtml
在 ReactDOM.Render()
方法之外创建 DOM 元素,因此它不是由 React 库动态维护的。这基本上违背了使用 React 的初衷(显示和维护虚拟 DOM)。
不过,更令人担忧的是,它容易受到跨站点脚本 (XSS) 攻击,这就是它得名的地方。这些是网络上非常常见的攻击形式。你可以在这里阅读:https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml
如果您希望应用程序不易受到攻击,则必须对 DOMPurify
使用类似 dangerouslySetInnerHtml
的清理库,因此无论哪种方式,您都可能有另一个依赖项。一旦您为生产编译应用程序 (npm build
),最小化过程会使代码库非常紧凑,您可以使用代码拆分等技术预先进行一些优化,这使得页面的每个部分仅在请求时加载,而不是一次性:https://reactjs.org/docs/code-splitting.html
我个人不会太担心一些依赖项 - 它们是现代网络上的一个现实。我一直倾向于使用 html-react-parser
,但我警告说我没有调查它是否减少了 XSS 漏洞。但是,即使两者都容易受到 XSS 攻击,至少 html-react-parser
会通过 ReactDOM.render()
引入元素,因此它们不会使 DOM 变得一团糟——这听起来像是灾难的秘诀.