dompurify 3.4.9 → 3.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -13
- package/dist/purify.cjs.d.ts +3 -3
- package/dist/purify.cjs.js +359 -190
- package/dist/purify.cjs.js.map +1 -1
- package/dist/purify.cov.cjs.js +26427 -0
- package/dist/purify.cov.cjs.js.map +1 -0
- package/dist/purify.es.d.mts +3 -3
- package/dist/purify.es.mjs +359 -190
- package/dist/purify.es.mjs.map +1 -1
- package/dist/purify.js +359 -190
- package/dist/purify.js.map +1 -1
- package/dist/purify.min.js +2 -2
- package/dist/purify.min.js.map +1 -1
- package/package.json +23 -8
- package/src/config.ts +0 -2
- package/src/purify.ts +498 -656
- package/src/regexp.ts +8 -0
- package/src/types.ts +354 -0
package/README.md
CHANGED
|
@@ -2,21 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/dompurify) [](https://github.com/cure53/DOMPurify/blob/main/LICENSE) [](https://www.npmjs.com/package/dompurify) [](https://github.com/cure53/DOMPurify/network/dependents)  [](https://cloudback.it)
|
|
4
4
|
|
|
5
|
-
[](https://github.com/cure53/DOMPurify/actions/workflows/build-and-test.yml) [](https://www.bestpractices.dev/projects/12162) [](https://github.com/cure53/DOMPurify/actions/workflows/build-and-test.yml) [](https://scorecard.dev/viewer/?uri=github.com/cure53/DOMPurify) [](https://badge.socket.dev/npm/package/dompurify/latest) [](https://security.snyk.io/package/npm/dompurify)
|
|
6
6
|
|
|
7
7
|
DOMPurify is a DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG.
|
|
8
8
|
|
|
9
|
-
It's also very simple to use and get started with. DOMPurify was [started in February 2014](https://github.com/cure53/DOMPurify/commit/a630922616927373485e0e787ab19e73e3691b2b) and, meanwhile, has reached version **v3.4.
|
|
9
|
+
It's also very simple to use and get started with. DOMPurify was [started in February 2014](https://github.com/cure53/DOMPurify/commit/a630922616927373485e0e787ab19e73e3691b2b) and, meanwhile, has reached version **v3.4.11**.
|
|
10
10
|
|
|
11
11
|
DOMPurify runs as JavaScript and works in all modern browsers (Safari (10+), Opera (15+), Edge, Firefox and Chrome - as well as almost anything else using Blink, Gecko or WebKit). It doesn't break on MSIE or other legacy browsers. It simply does nothing.
|
|
12
12
|
|
|
13
13
|
**Note that [DOMPurify v2.5.9](https://github.com/cure53/DOMPurify/releases/tag/2.5.9) is the latest version supporting MSIE. For important security updates compatible with MSIE, please use the [2.x branch](https://github.com/cure53/DOMPurify/tree/2.x).**
|
|
14
14
|
|
|
15
|
-
Our automated tests cover 9 browser/OS combinations (Chromium, Firefox, and WebKit across Ubuntu, macOS, and Windows) on every push,
|
|
15
|
+
Our automated tests cover 9 browser/OS combinations on the current engines (Chromium, Firefox, and WebKit across Ubuntu, macOS, and Windows) on every push, and a separate matrix re-runs the suite on older engine snapshots (back to roughly Chromium 110, Firefox 108 and WebKit 16.4, around three years old) so regressions on outdated browsers get caught too. We also run Node.js v20, v22, v24, v25 and v26 with DOMPurify on [jsdom](https://github.com/jsdom/jsdom). Older Node versions are known to work as well, but hey... no guarantees.
|
|
16
16
|
|
|
17
17
|
DOMPurify is written by security people who have vast background in web attacks and XSS. Fear not. For more details please also read about our [Security Goals & Threat Model](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model). Please, read it. Like, really. And if you enjoy the gory details, the [Attack Classes & Bypass History](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History) page catalogs the parser-mutation, namespace, clobbering, and template tricks DOMPurify defends against.
|
|
18
18
|
|
|
19
|
-
The DOMPurify project inspired the creation of the [HTML Sanitizer API](https://wicg.github.io/sanitizer-api/#sanitizer), which is already shipping in [many browsers](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Sanitizer_API#browser_compatibility).
|
|
19
|
+
The DOMPurify project inspired the creation of the [HTML Sanitizer API](https://wicg.github.io/sanitizer-api/#sanitizer), which is already shipping in [many browsers](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Sanitizer_API#browser_compatibility). The same capability is now being standardized directly in the [WHATWG HTML specification](https://html.spec.whatwg.org/#html-sanitization).
|
|
20
|
+
|
|
21
|
+
## Table of Contents
|
|
22
|
+
|
|
23
|
+
- [What does it do?](#what-does-it-do)
|
|
24
|
+
- [How do I use it?](#how-do-i-use-it)
|
|
25
|
+
- [Is there a demo?](#is-there-a-demo)
|
|
26
|
+
- [What if I find a _security_ bug?](#what-if-i-find-a-security-bug)
|
|
27
|
+
- [Some purification samples please?](#some-purification-samples-please)
|
|
28
|
+
- [What is supported?](#what-is-supported)
|
|
29
|
+
- [What about legacy browsers like Internet Explorer?](#what-about-legacy-browsers-like-internet-explorer)
|
|
30
|
+
- [What about DOMPurify and Trusted Types?](#what-about-dompurify-and-trusted-types)
|
|
31
|
+
- [Can I configure DOMPurify?](#can-i-configure-dompurify)
|
|
32
|
+
- [Persistent Configuration](#persistent-configuration)
|
|
33
|
+
- [Hooks](#hooks)
|
|
34
|
+
- [Removed Configuration](#removed-configuration)
|
|
35
|
+
- [Continuous Integration](#continuous-integration)
|
|
36
|
+
- [Security Mailing List](#security-mailing-list)
|
|
37
|
+
- [Who contributed?](#who-contributed)
|
|
20
38
|
|
|
21
39
|
## What does it do?
|
|
22
40
|
|
|
@@ -61,9 +79,7 @@ const clean = DOMPurify.sanitize(dirty, { USE_PROFILES: { html: true } });
|
|
|
61
79
|
|
|
62
80
|
### Is there any foot-gun potential?
|
|
63
81
|
|
|
64
|
-
Well, please note, if you _first_ sanitize HTML and then modify it _afterwards_, you might easily **void the effects of sanitization**. If you feed the sanitized markup to another library _after_ sanitization, please be certain that the library doesn't mess around with the HTML on its own.
|
|
65
|
-
|
|
66
|
-
See the [Security Goals & Threat Model](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model) for safe-usage recipes and the tags/attributes worth thinking twice about, and [Attack Classes & Bypass History](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History) for why post-processing and changing the markup context defeat sanitization.
|
|
82
|
+
Well, please note, if you _first_ sanitize HTML and then modify it _afterwards_, you might easily **void the effects of sanitization**. If you feed the sanitized markup to another library _after_ sanitization, please be certain that the library doesn't mess around with the HTML on its own. See the [Security Goals & Threat Model](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model) for safe-usage recipes and the tags/attributes worth thinking twice about, and [Attack Classes & Bypass History](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History) for why post-processing and changing the markup context defeat sanitization.
|
|
67
83
|
|
|
68
84
|
### Okay, makes sense, let's move on
|
|
69
85
|
|
|
@@ -124,7 +140,7 @@ const clean = DOMPurify.sanitize('<s>hello</s>');
|
|
|
124
140
|
|
|
125
141
|
Of course there is a demo! [Play with DOMPurify](https://cure53.de/purify)
|
|
126
142
|
|
|
127
|
-
## What if I find a
|
|
143
|
+
## What if I find a security bug?
|
|
128
144
|
|
|
129
145
|
First of all, please immediately contact us via [email](mailto:mario@cure53.de) so we can work on a fix. [PGP key](https://keyserver.ubuntu.com/pks/lookup?op=vindex&search=0xC26C858090F70ADA)
|
|
130
146
|
|
|
@@ -147,7 +163,7 @@ These are just a taste. For the full taxonomy of attack classes these samples co
|
|
|
147
163
|
|
|
148
164
|
## What is supported?
|
|
149
165
|
|
|
150
|
-
DOMPurify currently supports HTML5, SVG and MathML. DOMPurify per default allows CSS, HTML custom data attributes. DOMPurify also supports the Shadow DOM - and sanitizes DOM templates recursively. DOMPurify also allows you to sanitize HTML for being used with the jQuery `$()` and `elm.html()` API without any known problems.
|
|
166
|
+
DOMPurify currently supports HTML5, SVG and MathML. DOMPurify per default allows CSS, HTML custom data attributes. DOMPurify also supports the Shadow DOM - and sanitizes DOM templates recursively. DOMPurify also allows you to sanitize HTML for being used with the jQuery `$()` and `elm.html()` API without any known problems. For the exact set of elements and attributes permitted by default, see the [Default TAGs & ATTRIBUTEs allow-list & blocklist](https://github.com/cure53/DOMPurify/wiki/Default-TAGs-ATTRIBUTEs-allow-list-&-blocklist) wiki page.
|
|
151
167
|
|
|
152
168
|
## What about legacy browsers like Internet Explorer?
|
|
153
169
|
|
|
@@ -155,7 +171,7 @@ DOMPurify does nothing at all. It simply returns exactly the string that you fed
|
|
|
155
171
|
|
|
156
172
|
## What about DOMPurify and Trusted Types?
|
|
157
173
|
|
|
158
|
-
In version 1.0.9, support for [Trusted Types API](https://github.com/w3c/webappsec-trusted-types) was added to DOMPurify.
|
|
174
|
+
In version 1.0.9, support for the [Trusted Types API](https://github.com/w3c/webappsec-trusted-types) ([MDN](https://developer.mozilla.org/en-US/docs/Web/API/Trusted_Types_API)) was added to DOMPurify.
|
|
159
175
|
In version 2.0.0, a config flag was added to control DOMPurify's behavior regarding this.
|
|
160
176
|
|
|
161
177
|
When `DOMPurify.sanitize` is used in an environment where the Trusted Types API is available and `RETURN_TRUSTED_TYPE` is set to `true`, it tries to return a `TrustedHTML` value instead of a string (the behavior for `RETURN_DOM` and `RETURN_DOM_FRAGMENT` config options does not change).
|
|
@@ -182,6 +198,8 @@ window.trustedTypes.createPolicy('my-organization', {
|
|
|
182
198
|
|
|
183
199
|
Do **not** pass your own wrapping policy back to DOMPurify as its `TRUSTED_TYPES_POLICY` (for example via `DOMPurify.setConfig({ TRUSTED_TYPES_POLICY: myPolicy })`) when that policy's `createHTML` already calls `DOMPurify.sanitize`. That is circular by definition - sanitizing would call the policy, which sanitizes by calling DOMPurify again - and DOMPurify will throw a descriptive `TypeError` to prevent the infinite recursion. Your own policy should call DOMPurify; DOMPurify should not be configured to call your policy.
|
|
184
200
|
|
|
201
|
+
If you want this `default`-policy pattern applied across an entire page automatically - so that every HTML sink is sanitized, including legacy code, third-party widgets, and the thousands of `innerHTML` assignments you cannot easily find or rewrite - have a look at [DOMFortify](https://github.com/cure53/DOMFortify). It installs exactly such a Trusted Types `default` policy backed by DOMPurify and refuses script sinks (`eval`, `script.src`, ...) outright. It is a deliberately separate project: DOMPurify stays a focused sanitizer, and DOMFortify handles the document-wide enforcement layer that is intentionally out of DOMPurify's scope.
|
|
202
|
+
|
|
185
203
|
## Can I configure DOMPurify?
|
|
186
204
|
|
|
187
205
|
Yes. The included default configuration values are pretty good already - but you can of course override them. Check out the [`/demos`](https://github.com/cure53/DOMPurify/tree/main/demos) folder to see a bunch of examples on how you can [customize DOMPurify](https://github.com/cure53/DOMPurify/tree/main/demos#what-is-this).
|
|
@@ -486,7 +504,7 @@ DOMPurify.addHook(
|
|
|
486
504
|
|
|
487
505
|
## Continuous Integration
|
|
488
506
|
|
|
489
|
-
We are currently using GitHub Actions in combination with Playwright. This
|
|
507
|
+
We are currently using GitHub Actions in combination with Playwright. This lets us confirm on every commit that everything works in the relevant modern browsers, and a separate scheduled and on-merge workflow re-runs the suite on older engine snapshots so breakage on outdated browsers is caught too. Check out the build logs here: https://github.com/cure53/DOMPurify/actions
|
|
490
508
|
|
|
491
509
|
You can further run local tests by executing `npm run test`.
|
|
492
510
|
|
|
@@ -505,11 +523,16 @@ We use ESLint via `xo` as part of our pre-commit workflow to help ensure code co
|
|
|
505
523
|
These are our npm scripts:
|
|
506
524
|
|
|
507
525
|
- `npm run dev` to build the unminified UMD bundle while watching sources for changes
|
|
508
|
-
- `npm run test` to lint the sources, run tests through jsdom, and run
|
|
526
|
+
- `npm run test` to lint the sources, run tests through jsdom, and run browser tests in Chromium via Playwright
|
|
509
527
|
- `npm run test:jsdom` to only run tests through jsdom
|
|
528
|
+
- `npm run test:happydom` to run the suite through happy-dom (an unsupported environment; kept as a robustness check, not a compatibility promise)
|
|
510
529
|
- `npm run test:browser` to only run tests through Playwright
|
|
511
|
-
- `npm run test:
|
|
530
|
+
- `npm run test:browser:legacy` to run the suite on older browser engines (point `PW_MODULE` at a pinned old Playwright install; see `.github/workflows/legacy-browsers.yml`)
|
|
531
|
+
- `npm run test:ci` to run the CI test flow for jsdom and Playwright
|
|
512
532
|
- `npm run test:fuzz` to run a small fuzzer covering `sanitize()` and CONFIG
|
|
533
|
+
- `npm run bench` to run the jsdom micro-benchmark over the built `dist/purify.cjs` (build first; `--json` and `--compare a.json b.json` support A/B runs across branches - results are directional, confirm user-facing claims in real browsers)
|
|
534
|
+
- `npm run coverage` to build an instrumented bundle, run the jsdom suite, and write a local HTML line/branch coverage report to `coverage/index.html` (jsdom scope only, not run in CI)
|
|
535
|
+
- `npm run build:cov` to only build the instrumented coverage bundle
|
|
513
536
|
- `npm run lint` to lint the sources using ESLint via xo
|
|
514
537
|
- `npm run format` to format JavaScript/TypeScript and Markdown sources with Prettier
|
|
515
538
|
- `npm run format:js` to only format JavaScript/TypeScript sources
|
package/dist/purify.cjs.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @license DOMPurify 3.4.
|
|
1
|
+
/*! @license DOMPurify 3.4.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.11/LICENSE */
|
|
2
2
|
|
|
3
3
|
import { TrustedTypePolicy, TrustedTypesWindow, TrustedHTML } from 'trusted-types/lib/index.js';
|
|
4
4
|
|
|
@@ -212,8 +212,6 @@ interface UseProfilesConfig {
|
|
|
212
212
|
html?: boolean | undefined;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
-
declare const _default: DOMPurify;
|
|
216
|
-
|
|
217
215
|
interface DOMPurify {
|
|
218
216
|
/**
|
|
219
217
|
* Creates a DOMPurify instance using the given window-like object. Defaults to `window`.
|
|
@@ -444,6 +442,8 @@ type WindowLike = Pick<typeof globalThis, 'DocumentFragment' | 'HTMLTemplateElem
|
|
|
444
442
|
MozNamedAttrMap?: typeof window.NamedNodeMap;
|
|
445
443
|
} & Pick<TrustedTypesWindow, 'trustedTypes'>;
|
|
446
444
|
|
|
445
|
+
declare const _default: DOMPurify;
|
|
446
|
+
|
|
447
447
|
export { _default as default };
|
|
448
448
|
export type { Config, DOMPurify, DocumentFragmentHook, ElementHook, HookName, NodeHook, RemovedAttribute, RemovedElement, UponSanitizeAttributeHook, UponSanitizeAttributeHookEvent, UponSanitizeElementHook, UponSanitizeElementHookEvent, WindowLike };
|
|
449
449
|
|