提问人:sudoExclaimationExclaimation 提问时间:6/8/2023 最后编辑:sudoExclaimationExclaimation 更新时间:6/8/2023 访问量:244
在清理要在网站上显示的文本用户输入时:对文本进行转义 HTML 实体是否足够,还是我仍然需要对其进行 DOMPurify?
When sanitizing user input to be shown on website for text: is escaping HTML entities enough for text or do I still need to DOMPurify it?
问:
在清理要在网站上显示的文本用户输入时:对文本进行转义 HTML 实体是否足够,还是我仍然需要对其进行 DOMPurify?
我正在构建一个网站,用户可以在其中输入 2 种类型的文本:
- 要呈现为标题、显示名称、单个链接等的文本
- 呈现为 markdown 的文本。例如,这将是一篇文章的正文。
为了清理这些输入并防止 XSS,这是我计划使用的技术。请注意,我对 2 种类型使用不同的技术。以下是我所依赖的功能:
function cleanedText(unclean){
return escapeHTML(unclean.trim());
}
function cleanedMarkdown(unclean){
return DOMPurify.sanitize(marked.parse(unclean.trim()));
}
function escapeHTML(html) {
var escape = document.createElement('textarea');
escape.textContent = html;
return escape.innerHTML;
}
function unescapeHTML(html) {
var escape = document.createElement('textarea');
escape.innerHTML = html;
return escape.textContent;
}
对于 1(标题、显示名称等的文本),我使用该函数。cleanedText()
对于 2 (markdown),我使用该函数。cleanedMarkdown()
正如你所看到的,它做了更多的工作 - 它首先解析 Markdown,然后用 清理生成的 Markdown HTML。它不会转义 HTML 实体。cleanedMarkdown()
DOMPurify
然而,唯一转义 HTML。事实并非如此,因为根据我的理解,由于实体已经转义,它们只能呈现为文本,而不能被解释为 HTML。HTML 实体代码来自:cleanedText()
DOMPurify
escaping
https://stackoverflow.com/a/9251169/1634905
以下内容:
let title = cleanedText(`123<a href='javascript:alert(1)'>I am a dolphin!</a>Billy <script>alert('Hello Bob!')</script> #hashtag this is awesome#sauce<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT>`);
console.log(title)
输出:
123<a href='javascript:alert(1)'>I am a dolphin!</a>Billy <script>alert('Hello Bob!')</script> #hashtag this is awesome#sauce<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT>
这对我来说似乎没问题,并且也可以在我的网站中正确呈现为文本。
我对不需要 DOMPurify 类型 1 的理解是否正确?
答: 暂无答案
评论