cure53/DOMPurify
GitHub: cure53/DOMPurify
DOMPurify 是一个基于 DOM 的超快 XSS 净化器,通过剥离 HTML、SVG 和 MathML 中的恶意内容来防止跨站脚本攻击。
Stars: 16820 | Forks: 831
# DOMPurify
[](http://badge.fury.io/js/dompurify)  [](https://www.npmjs.com/package/dompurify)  [](https://github.com/cure53/DOMPurify/network/dependents) [](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');
```
## 有演示吗?
当然有演示
## 如果我发现了_安全_漏洞怎么办?
首先,请立即通过[电子邮件](mailto:mario@cure53.de)联系我们,以便我们着手修复。[PGP 密钥](https://keyserver.ubuntu.com/pks/lookup?op=vindex&search=0xC26C858090F70ADA)
此外,你可能有资格获得漏洞赏金 的优秀员工在其服务中使用了 DOMPurify,并将我们的库纳入了他们的漏洞赏金范围。因此,如果你找到了绕过或削弱 DOMPurify 的方法,也请查看他们的网站和[漏洞赏金信息](https://www.fastmail.com/about/bugbounty/)。
## 请给一些净化示例?
净化后的标记是什么样的?嗯,[演示](https://cure53.de/purify)展示了一大批令人讨厌的元素。但我们也可以展示一些更小的例子!
```
DOMPurify.sanitize('
'); // becomes
DOMPurify.sanitize('