跳到主要内容

dangerouslySetInnerHTML

2023年12月06日
柏拉文
越努力,越幸运

一、认识


dangerouslySetInnerHTMLReact 为浏览器 DOM 提供 innerHTML 的替换方案。通常来讲,使用代码直接设置 HTML 存在风险,因为很容易无意中使用户暴露于跨站脚本(XSS)的攻击。因此,你可以直接在 React 中设置 HTML,但当你想设置 dangerouslySetInnerHTML 时,需要向其传递包含 key__html 的对象,以此来警示你。

二、语法


const htmlStr = "测试<a>高亮测试</a>测试"

<div dangerouslySetInnerHTML={{ __html: htmlStr }}></div>

三、问题


3.1 dangerousSetInnerHTMl 知道不?和 innerHTML 的区别?

React 中, 你可以使用 dangerouslySetInnerHTML 来直接设置元素的 HTML 内容, 它的命名中包含 dangerously 就已经暗示了它的风险性, 因为直接插入 HTML 可能导致 XSS(跨站脚本攻击)。dangerouslySetInnerHTML 要求你传递一个对象, 该对象必须包含一个属性 __html, 其值就是你想插入的 HTML 字符串。因为绕过了 ReactDOM 管理机制, 直接注入 HTML, 所以它被标记为 危险。开发者需要确保插入的 HTML 是安全的, 不包含恶意代码。dangerouslySetInnerHTMLReact 提供的 API, 需要传递一个对象 { __html: ... }, 并且只能用在 JSX 内。

传统 DOMinnerHTML 属性直接获取或设置元素的 HTML 内容, 同样, 直接设置 innerHTML 也存在 XSS 风险,需要开发者手动确保传入的字符串是安全的。innerHTML 是浏览器原生的 DOM 属性,直接赋值即可。