在清理要在网站上显示的文本用户输入时:对文本进行转义 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?

提问人:sudoExclaimationExclaimation 提问时间:6/8/2023 最后编辑:sudoExclaimationExclaimation 更新时间:6/8/2023 访问量:244

问:

在清理要在网站上显示的文本用户输入时:对文本进行转义 HTML 实体是否足够,还是我仍然需要对其进行 DOMPurify?

我正在构建一个网站,用户可以在其中输入 2 种类型的文本:

  1. 要呈现为标题、显示名称、单个链接等的文本
  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()DOMPurifyescaping

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&lt;a href='javascript:alert(1)'&gt;I am a dolphin!&lt;/a&gt;Billy &lt;script&gt;alert('Hello Bob!')&lt;/script&gt; #hashtag this is awesome#sauce&lt;SCRIPT SRC=http://xss.rocks/xss.js&gt;&lt;/SCRIPT&gt;

这对我来说似乎没问题,并且也可以在我的网站中正确呈现为文本。

我对不需要 DOMPurify 类型 1 的理解是否正确?

JavaScript HTML Markdown XSS Dompurify

评论


答: 暂无答案