使用 DOMParser 解析 HTML 是否可以避免 XSS?

Mar*_*sen 4 javascript xss domparser

我在代码中使用DOMParser,如下所示:

\n
 html`${this.domParser.parseFromString(this.richText, \'text/html\').body.children}`\n
Run Code Online (Sandbox Code Playgroud)\n

阅读文档后,我有点担心这Cross site Scripting attacks仍然是可能的,因为正如文档所述:

\n
\n

您可以使用 XMLSerializer 接口执行相反的操作\xe2\x80\x94将 DOM 树转换为 XML 或 HTML 源\xe2\x80\x94。

\n
\n

然而它也声明它返回

\n
\n

Document 或 XMLDocument,具体取决于 mimeType 参数。

\n
\n

那么使用这种方法是否有助于保护您的网站免受攻击XSS

\n

Sha*_*ger 8

DOMParser创建的文档是在禁用脚本的情况下创建的;该脚本会被解析,但不会运行,因此它应该可以安全地防御 XSS。也就是说,如果您在服务器端执行此操作并将结果提供给客户端,则客户端将不知道“noscript”上下文,因此它可能是正确上下文中的漏洞来源。

  • @MarcRasmussen:[另一个答案](/sf/answers/4539055391/)给出了一个示例,您可以使用生成的解析后的HTML将解析后的HTML注入到调用编程行为的页面中。 (2认同)

cus*_*der 8

在这篇关于介绍性文章中,我们可以看到这是一个已知的 XSS 接收器。DOMParser#parseFromString

这些<script>块不会执行,但解析器无法判断什么构成了 XSS 威胁。

您不能使用它来安全地将 html 注入到页面中:

const parser = new DOMParser();
const html = '<img onerror="alert(`gotcha`)" src="">';
const new_node = parser.parseFromString(html, 'text/html').body.firstChild;
document.querySelector('div').appendChild(new_node);
Run Code Online (Sandbox Code Playgroud)
<div></div>
Run Code Online (Sandbox Code Playgroud)


如何净化 HTML?

您可以使用专门构建的库,例如

const dirty = '<img onerror="alert(`gotcha`)" src="">';
const clean = DOMPurify.sanitize(dirty);

console.log(clean);
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/dompurify@2.2.2/dist/purify.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • 只要您将不受信任的节点远离窗口 DOM(仅将其用于数据处理),DOMParser 就是安全的。事实上,DOMPurify 在底层使用 DOMParser 来帮助处理不安全的 html。(毫无疑问,不要使用 DOMParser 来清理 html,并且再次强调,不要将其结果视为可以添加到主文档中的可信 html) (3认同)