cure53/DOMPurify

GitHub: cure53/DOMPurify

DOMPurify 是一个基于 DOM 的超快 XSS 净化器,通过剥离 HTML、SVG 和 MathML 中的恶意内容来防止跨站脚本攻击。

Stars: 16820 | Forks: 831

# DOMPurify [![npm](https://badge.fury.io/js/dompurify.svg)](http://badge.fury.io/js/dompurify) ![测试](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/320347ecd6095059.svg) [![下载量](https://img.shields.io/npm/dm/dompurify.svg)](https://www.npmjs.com/package/dompurify) ![npm package minimized gzipped size (select exports)](https://img.shields.io/bundlejs/size/dompurify?color=%233C1&label=gzip) [![依赖项](https://badgen.net/github/dependents-repo/cure53/dompurify?color=green&label=dependents)](https://github.com/cure53/DOMPurify/network/dependents) [![Cloudback](https://app.cloudback.it/badge/cure53/DOMPurify)](https://cloudback.it) DOMPurify 是一个仅基于 DOM、超快速、超高容错性的 HTML、MathML 和 SVG XSS 净化器。 它也非常简单易用。DOMPurify [始于 2014 年 2 月](https://github.com/cure53/DOMPurify/commit/a630922616927373485e0e787ab19e73e3691b2b),目前,已经发布了 **v3.3.3** 版本。 DOMPurify 作为 JavaScript 运行,适用于所有现代浏览器(Safari (10+)、Opera (15+)、Edge、Firefox 和 Chrome - 以及几乎所有其他使用 Blink、Gecko 或 WebKit 的浏览器)。它在 MSIE 或其他旧版浏览器上不会崩溃,而是什么都不做。 **请注意,[DOMPurify v2.5.9](https://github.com/cure53/DOMPurify/releases/tag/2.5.9) 是支持 MSIE 的最新版本。如需兼容 MSIE 的重要安全更新,请使用 [2.x 分支](https://github.com/cure53/DOMPurify/tree/2.x)。** 我们的自动化测试目前涵盖了 [39 种不同的浏览器](https://github.com/cure53/DOMPurify/blob/main/test/karma.custom-launchers.config.js#L5),后续还会增加。我们还覆盖了在 [jsdom](https://github.com/jsdom/jsdom) 上运行 DOMPurify 的 Node.js v20.x、v22.x、24.x 和 v25.x。已知更旧的 Node 版本也可以运行,但是……不作保证。 DOMPurify 由在 Web 攻击和 XSS 方面拥有丰富背景的安全人员编写。不用害怕。有关更多详细信息,另请阅读我们的[安全目标与威胁模型](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model)。请务必阅读。我是认真的。 ## 它是做什么的? DOMPurify 净化 HTML 并防止 XSS 攻击。你可以将充满脏 HTML 的字符串提供给 DOMPurify,它会返回一个干净的 HTML 字符串(除非另有配置)。DOMPurify 将剥离所有包含危险 HTML 的内容,从而防止 XSS 攻击和其他恶意行为。它的速度也非常快。我们利用浏览器提供的技术并将其转化为一个 XSS 过滤器。你的浏览器越快,DOMPurify 就越快。 ## 我该如何使用它? 很简单。只需在你的网站上引入 DOMPurify 即可。 ### 使用未压缩版本(提供 source-map) ``` ``` ### 使用压缩并经过测试的生产版本(提供 source-map) ``` ``` 之后,你可以通过执行以下代码来净化字符串: ``` const clean = DOMPurify.sanitize(dirty); ``` 或者,如果你喜欢使用 Angular 或类似框架,可以这样: ``` import DOMPurify from 'dompurify'; const clean = DOMPurify.sanitize('hello there'); ``` 生成的 HTML 可以使用 `innerHTML` 写入 DOM 元素,或使用 `document.write()` 写入 DOM。这完全取决于你。 请注意,默认情况下,我们允许 HTML、SVG **和** MathML。如果你只需要 HTML(这可能是一个非常常见的用例),你也可以轻松地进行设置: ``` const clean = DOMPurify.sanitize(dirty, { USE_PROFILES: { html: true } }); ``` ### 有没有潜在的自毁风险? 嗯,请注意,如果你_先_净化了 HTML,然后_又_对其进行了修改,你可能很容易**破坏净化的效果**。如果你在净化_之后_将标记提供给另一个库,请确保该库不会自行篡改 HTML。 ## 好的,有道理,我们继续 在净化你的标记之后,你还可以查看 `DOMPurify.removed` 属性,找出被剔除的元素和属性。请**不要**使用此属性做出任何安全关键决策。这只是为好奇者提供的一个小工具。 ### 在服务器上运行 DOMPurify DOMPurify 在技术上也可以在带有 Node.js 的服务器端运行。我们的支持致力于遵循 [Node.js 发布周期](https://nodejs.org/en/about/previous-releases)。 在服务器上运行 DOMPurify 需要 DOM 存在,这可能不足为奇。通常,[jsdom](https://github.com/jsdom/jsdom) 是首选工具,我们**强烈建议**使用最新版本的 _jsdom_。 为什么?因为已知旧版本的 _jsdom_ 存在一些 bug,_即使_ DOMPurify 100% 正确地执行了所有操作,这些 bug 也会导致 XSS。例如,在 _jsdom v19.0.0_ 中存在**已知的攻击媒介**,该问题已在 _jsdom v20.0.0_ 中修复——因此我们真的建议保持 _jsdom_ 处于最新版本。 还请注意,虽然存在像 [happy-dom](https://github.com/capricorn86/happy-dom) 这样的工具,但目前它们**被认为是不安全的**。目前不建议将 DOMPurify 与 _happy-dom_ 结合使用,这可能会导致 XSS。 除此之外,你完全可以在服务器上使用 DOMPurify。大概吧。这实际上取决于 _jsdom_ 或你在服务器端使用的任何 DOM。如果你能接受这一点,以下是让它工作的方法: ``` npm install dompurify npm install jsdom ``` 对于 _jsdom_(请使用最新版本),这样做应该就可以了: ``` const createDOMPurify = require('dompurify'); const { JSDOM } = require('jsdom'); const window = new JSDOM('').window; const DOMPurify = createDOMPurify(window); const clean = DOMPurify.sanitize('hello there'); ``` 或者,如果你更喜欢使用 imports,甚至可以这样: ``` import { JSDOM } from 'jsdom'; import DOMPurify from 'dompurify'; const window = new JSDOM('').window; const purify = DOMPurify(window); const clean = purify.sanitize('hello there'); ``` 如果你在特定的设置中使其工作时遇到问题,可以考虑查看极棒的 [isomorphic-dompurify](https://github.com/kkomelin/isomorphic-dompurify) 项目,它解决了人们可能遇到的大量问题。 ``` npm install isomorphic-dompurify ``` ``` import DOMPurify from 'isomorphic-dompurify'; const clean = DOMPurify.sanitize('hello'); ``` ## 有演示吗? 当然有演示![体验 DOMPurify](https://cure53.de/purify) ## 如果我发现了_安全_漏洞怎么办? 首先,请立即通过[电子邮件](mailto:mario@cure53.de)联系我们,以便我们着手修复。[PGP 密钥](https://keyserver.ubuntu.com/pks/lookup?op=vindex&search=0xC26C858090F70ADA) 此外,你可能有资格获得漏洞赏金![Fastmail](https://www.fastmail.com/) 的优秀员工在其服务中使用了 DOMPurify,并将我们的库纳入了他们的漏洞赏金范围。因此,如果你找到了绕过或削弱 DOMPurify 的方法,也请查看他们的网站和[漏洞赏金信息](https://www.fastmail.com/about/bugbounty/)。 ## 请给一些净化示例? 净化后的标记是什么样的?嗯,[演示](https://cure53.de/purify)展示了一大批令人讨厌的元素。但我们也可以展示一些更小的例子! ``` DOMPurify.sanitize(''); // becomes DOMPurify.sanitize(''); // becomes DOMPurify.sanitize('

abc