Rol*_*iza 4 html escaping reactjs
我正在使用 React 创建一个 SPA,用于搜索数据并显示结果。每个结果都遵循以下模型
{
"title": "A Title",
"body": " <li>escaped html&nbsp;<strong>that sould be rendered</strong>.</li>
</ul>"
}
Run Code Online (Sandbox Code Playgroud)
该body属性始终是应该在组件中呈现的转义 html。该组件如下所示:
function SearchResult({ title, body, favourite }) {
return (
<article className="SearchResult">
<section>
<i className={`icon-star${favourite ? ' marked' : ''}`} />
{title}
</section>
<section
dangerouslySetInnerHTML={{ __html: body }}
className="SearchResult-body"
/>
</article>
);
}
Run Code Online (Sandbox Code Playgroud)
问题是,只有当我创建将变量传递给body属性的组件时才会发生这种情况
results.map((result, index) => (
<SearchResult key={index} title={result.title} body={result.body} />
))
Run Code Online (Sandbox Code Playgroud)
但如果我这样做,效果很好
<SearchResult
title="A title"
body=" <li>escaped html&nbsp;<strong>that sould be rendered</strong>.</li>
</ul>"
/>
Run Code Online (Sandbox Code Playgroud)
为什么会有所不同?在使用固定值时默认添加的属性中传递该值之前,是否应该添加任何预处理?
可以在此处查看此问题的演示
似乎只有当您给它提供转义的 html 时才会出现此问题。
@sergiotapia实现的解决方案涉及创建一个辅助函数来转义 html 字符串以使其正常工作。
htmlDecode(content) {
let e = document.createElement('div');
e.innerHTML = content;
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}
Run Code Online (Sandbox Code Playgroud)
<section
dangerouslySetInnerHTML={{ __html: htmlDecode(body) }}
className="SearchResult-body"
/>
Run Code Online (Sandbox Code Playgroud)
然而,正如@brigand提到的,我将引用“取消转义它可能会导致 XSS 攻击和不正确的渲染。 ”所以这可能不是完美的解决方案。
请参阅工作示例
| 归档时间: |
|
| 查看次数: |
18815 次 |
| 最近记录: |