我想使用 html-react-parser 从我的 CMS 中清理和解析 HTML。 它是否有效地清理了来自 XSS 攻击的输入? https://stackoverflow.com/questions/29044518/safe-alternative-to-dangerouslysetinnerhtml#answer -48261046 声称确实如此。 如果是这样,我认为最好在自述文件中的某处记录/宣传这一点。 感谢您在这方面所做的工作。
好问题@dave-stevens-net!
不幸的是它没有。 原因是我选择让这个库变得灵活而不是严格。
虽然有替换选项,但检查所有可能的攻击可能太多了。 我建议,而不是使用XSS消毒与dangerouslySetInnerHTML 。
很高兴知道。 感谢您及时的回复。
不客气。 如果这回答了您的问题@dave-stevens-net,问题可以解决吗?
我最终使用sanitize-html包依赖项编写了一个 Sanitize 组件。
import React from 'react'
import sanitizeHtml from 'sanitize-html'
const Sanitize = ({ html }) => {
const clean = sanitizeHtml(html, {
allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img', 'span']),
allowedAttributes: {
...
},
})
return (
<span
className="sanitized-html"
dangerouslySetInnerHTML={{ __html: clean }}
/>
)
}
export default Sanitize
用法示例:
<Sanitize html={data.wordpressPage.title} />
@harveydf很棒的发现! 感谢您创建和分享小提琴。
我将更新README.md
以注意该库不是 XSS 安全的。
我不想使用 sanitize-html,因为它很大。 我改用了 dompurify,它小了 10 倍,并且不会删除 CSS。
import parse, { domToReact } from 'html-react-parser'
import DOMPurify from 'dompurify'
import React from 'react'
// export function replaceNode() {}
export default function html(html, opts = {}) {
return parse(DOMPurify.sanitize(html), {
...{
replace: replaceNode,
},
...opts,
})
}
html('<iframe src=javascript:alert("xss")></iframe>')
最有用的评论
我不想使用 sanitize-html,因为它很大。 我改用了 dompurify,它小了 10 倍,并且不会删除 CSS。
html('<iframe src=javascript:alert("xss")></iframe>')