Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
DOMPurify — DOMPurify - un sanitiseur XSS uniquement DOM, ultra-rapide et ultra-tolérant, pour HTML, MathML et SVG. DOMPurify fonctionne avec une configuration sécurisée par défaut, mais offre de nombreuses options de configuration et des hooks. Démo : | Kitploit
Outils/GitHubGitHub/cure53/dompurify
Outils DéfensifsAnalyse StatiqueAnalyse de CodeSécurité WebApprentissage et ÉducationSécurité des API
GitHubcure53/dompurify

DOMPurify

DOMPurify - un sanitiseur XSS uniquement DOM, ultra-rapide et ultra-tolérant, pour HTML, MathML et SVG. DOMPurify fonctionne avec une configuration sécurisée par défaut, mais offre de nombreuses options de configuration et des hooks. Démo :

Voir le dépôt
17.3k860il y a 2 joursVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Site web

DOMPurify

npm License Downloads dependents npm package minimized gzipped size (select exports) Cloudback

OpenSSF Best Practices Build & Test OpenSSF Scorecard Socket Badge snyk.io package health

DOMPurify est un assainisseur XSS exclusivement basé sur le DOM, ultra-rapide et extrêmement tolérant, pour HTML, MathML et SVG.

Il est également très simple à utiliser et à prendre en main. DOMPurify a été lancé en février 2014 et a, entre-temps, atteint la version v3.4.14.

DOMPurify s'exécute en JavaScript et fonctionne dans tous les navigateurs modernes (Safari (10+), Opera (15+), Edge, Firefox et Chrome — ainsi que presque tout le reste utilisant Blink, Gecko ou WebKit). Il ne casse rien sur MSIE ou les autres navigateurs hérités. Il ne fait tout simplement rien.

Notez que DOMPurify v2.5.9 est la dernière version prenant en charge MSIE. Pour les mises à jour de sécurité importantes compatibles avec MSIE, veuillez utiliser la branche 2.x.

Nos tests automatisés couvrent 9 combinaisons navigateur/système d'exploitation sur les moteurs actuels (Chromium, Firefox et WebKit sur Ubuntu, macOS et Windows) à chaque push, et une matrice séparée relance la suite sur des instantanés plus anciens des moteurs (jusqu'à environ Chromium 110, Firefox 108 et WebKit 16.4, vieux d'environ trois ans) afin que les régressions sur les navigateurs obsolètes soient également détectées. Nous exécutons aussi Node.js v20, v22, v24, v25 et v26 avec DOMPurify sur jsdom. Les versions plus anciennes de Node sont connues pour fonctionner également, mais bon... aucune garantie.

DOMPurify est écrit par des experts en sécurité qui possèdent une vaste expérience des attaques web et du XSS. N'ayez crainte. Pour plus de détails, veuillez également lire notre Security Goals & Threat Model. S'il vous plaît, lisez-le. Vraiment. Et si vous aimez les détails sanglants, la page Attack Classes & Bypass History catalogue les astuces de mutation du parseur, de namespace, de clobbering et de templates contre lesquelles DOMPurify se défend.

Le projet DOMPurify a inspiré la création de l'API HTML Sanitizer, qui est déjà déployée dans de nombreux navigateurs. La même capacité est désormais en cours de standardisation directement dans la spécification HTML du WHATWG.

Table des matières

  • Que fait-il ?
  • Comment l'utiliser ?
  • Y a-t-il une démo ?
  • Et si je trouve un bug de sécurité ?
  • Quelques exemples de purification ?
  • Qu'est-ce qui est pris en charge ?
  • Qu'en est-il des navigateurs hérités comme Internet Explorer ?
  • Qu'en est-il de DOMPurify et des Trusted Types ?
  • Puis-je configurer DOMPurify ?
  • Configuration persistante
  • Hooks
  • Configuration supprimée
  • Intégration continue
  • Liste de diffusion sur la sécurité
  • Qui a contribué ?

Que fait-il ?

DOMPurify assainit le HTML et prévient les attaques XSS. Vous pouvez fournir à DOMPurify, par exemple, une chaîne remplie de HTML sale et il retournera une chaîne (sauf configuration contraire) contenant du HTML propre. DOMPurify supprimera tout ce qui contient du HTML dangereux, prévenant ainsi les attaques XSS et autres saletés. C'est également sacrément rapide. Nous utilisons les technologies fournies par le navigateur et les transformons en filtre XSS. Plus votre navigateur est rapide, plus DOMPurify le sera.

Comment l'utiliser ?

C'est facile. Il suffit d'inclure DOMPurify sur votre site web.

Utilisation de la version non minifiée (source-map disponible)```html

root@kitploit:~
### Utilisation de la version de production minifiée et testée (source-map disponible)```html
<script type="text/javascript" src="dist/purify.min.js"></script>

Ensuite, vous pouvez assainir les chaînes de caractères en exécutant le code suivant :```js const clean = DOMPurify.sanitize(dirty);

root@kitploit:~
Ou peut-être ceci, si vous aimez travailler avec Angular ou similaire :```js
import DOMPurify from 'dompurify';

const clean = DOMPurify.sanitize('<b>hello there</b>');

The resulting HTML can be written into a DOM element using innerHTML or the DOM using document.write(). That is fully up to you. Note that by default, we permit HTML, SVG and MathML. If you only need HTML, which might be a very common use-case, you can easily set that up as well:```js const clean = DOMPurify.sanitize(dirty, { USE_PROFILES: { html: true } });

root@kitploit:~
### Y a-t-il un risque de se tirer dans le pied ?

Eh bien, veuillez noter que si vous _d'abord_ assainissez le HTML puis le modifiez _ensuite_, vous pourriez facilement **annuler les effets de l'assainissement**. Si vous transmettez le balisage assaini à une autre bibliothèque _après_ l'assainissement, assurez-vous que cette bibliothèque ne modifie pas le HTML de son côté. Consultez le [Security Goals & Threat Model](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model) pour des recettes d'utilisation sûre et pour les balises/attributs à doublement réfléchir, et [Attack Classes & Bypass History](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History) pour comprendre pourquoi le post-traitement et la modification du contexte du balisage compromettent l'assainissement.

### D'accord, ça a du sens, passons à la suite

Après avoir assaini votre balisage, vous pouvez également jeter un œil à la propriété `DOMPurify.removed` et découvrir quels éléments et attributs ont été rejetés. Veuillez **ne pas utiliser** cette propriété pour prendre des décisions critiques en matière de sécurité. Ce n'est qu'un petit outil pour les esprits curieux.

### Exécuter DOMPurify côté serveur

Techniquement, DOMPurify fonctionne également côté serveur avec Node.js. Notre support s'efforce de suivre le [cycle de publication de Node.js](https://nodejs.org/en/about/previous-releases).

Exécuter DOMPurify sur le serveur nécessite la présence d'un DOM, ce qui n'est probablement pas une surprise. En général, [jsdom](https://github.com/jsdom/jsdom) est l'outil de choix et nous **recommandons vivement** d'utiliser la dernière version de _jsdom_.

Pourquoi ? Parce que les anciennes versions de _jsdom_ sont connues pour avoir des bogues qui entraînent des XSS _même si_ DOMPurify fait tout 100 % correctement. Il existe des **vecteurs d'attaque connus** dans, par exemple, _jsdom v19.0.0_ qui sont corrigés dans _jsdom v20.0.0_ - et nous recommandons vraiment de maintenir _jsdom_ à jour pour cette raison.

Veuillez également noter que des outils comme [happy-dom](https://github.com/capricorn86/happy-dom) existent mais **ne sont pas considérés comme sûrs** à l'heure actuelle. Combiner DOMPurify avec _happy-dom_ n'est actuellement pas recommandé et conduira probablement à des XSS. Pour comprendre pourquoi le DOM côté serveur que vous choisissez fait partie de votre base de confiance informatique, consultez [Attack Classes & Bypass History](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History).

À part cela, vous pouvez utiliser DOMPurify sur le serveur. Probablement. Cela dépend vraiment de _jsdom_ ou de tout autre DOM que vous utilisez côté serveur. Si vous pouvez vivre avec cela, voici comment le faire fonctionner :```bash
npm install dompurify
npm install jsdom

Pour jsdom (veuillez utiliser une version à jour), cela devrait faire l'affaire :```js const createDOMPurify = require('dompurify'); const { JSDOM } = require('jsdom');

const window = new JSDOM('').window; const DOMPurify = createDOMPurify(window); const clean = DOMPurify.sanitize('hello there');

root@kitploit:~
Ou même ceci, si vous préférez travailler avec les imports :```js
import { JSDOM } from 'jsdom';
import DOMPurify from 'dompurify';

const window = new JSDOM('').window;
const purify = DOMPurify(window);
const clean = purify.sanitize('<b>hello there</b>');

Si vous avez des problèmes pour le faire fonctionner dans votre configuration spécifique, pensez à consulter l'incroyable projet isomorphic-dompurify qui résout de nombreux problèmes que les gens pourraient rencontrer.```bash npm install isomorphic-dompurify

root@kitploit:~
The input content is empty — no text was provided to translate. Please supply the chunk content.```js
import DOMPurify from 'isomorphic-dompurify';

const clean = DOMPurify.sanitize('<s>hello</s>');

Y a-t-il une démo ?

Bien sûr qu'il y a une démo ! Jouez avec DOMPurify

Et si je trouve un bug de sécurité ?

Tout d'abord, veuillez nous contacter immédiatement par courriel afin que nous puissions travailler sur un correctif. Clé PGP

De plus, vous êtes probablement éligible à un programme de bug bounty ! Les personnes formidables de Fastmail utilisent DOMPurify pour leurs services et ont ajouté notre bibliothèque à leur périmètre de bug bounty. Donc, si vous trouvez un moyen de contourner ou d'affaiblir DOMPurify, jetez également un œil à leur site Web et aux informations sur le bug bounty.

Quelques exemples de purification, s'il vous plaît ?

À quoi ressemble le balisage purifié ? Eh bien, la démo le montre pour un grand nombre d'éléments dangereux. Mais montrons aussi quelques exemples plus petits !```js DOMPurify.sanitize(''); // becomes DOMPurify.sanitize('<g/onload=alert(2)//

'); // becomes DOMPurify.sanitize('

abcdef

'); // becomes

abc

DOMPurify.sanitize('<mi//xlink:href="data:x,">'); // becomes DOMPurify.sanitize(''); // becomes
HELLO
HELLO
DOMPurify.sanitize('
  • <A HREF=//google.com>click
'); // becomes
  • click

root@kitploit:~
Ce n'est là qu'un aperçu. Pour la taxonomie complète des classes d'attaques d'où proviennent ces échantillons - mutation XSS, confusion d'espaces de noms, DOM clobbering, évasions rawtext, et plus encore - voir [Attack Classes & Bypass History](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History).

## Qu'est-ce qui est pris en charge ?

DOMPurify prend actuellement en charge HTML5, SVG et MathML. Par défaut, DOMPurify autorise le CSS et les attributs de données personnalisés HTML. DOMPurify prend également en charge le Shadow DOM - et assainit récursivement les modèles DOM. DOMPurify vous permet également d'assainir le HTML pour qu'il soit utilisé avec l'API jQuery `$()` et `elm.html()` sans aucun problème connu. Pour la liste exacte des éléments et attributs autorisés par défaut, voir la page wiki [Default TAGs & ATTRIBUTEs allow-list & blocklist](https://github.com/cure53/DOMPurify/wiki/Default-TAGs-ATTRIBUTEs-allow-list-&-blocklist).

## Qu'en est-il des anciens navigateurs comme Internet Explorer ?

DOMPurify ne fait rien du tout. Il renvoie simplement exactement la chaîne que vous lui avez fournie. DOMPurify expose une propriété appelée `isSupported`, qui vous indique s'il sera capable de faire son travail, afin que vous puissiez mettre au point votre propre plan de secours.

## Qu'en est-il de DOMPurify et des Trusted Types ?

Dans la version 1.0.9, la prise en charge de l'[API Trusted Types](https://github.com/w3c/webappsec-trusted-types) ([MDN](https://developer.mozilla.org/en-US/docs/Web/API/Trusted_Types_API)) a été ajoutée à DOMPurify.
Dans la version 2.0.0, un drapeau de configuration a été ajouté pour contrôler le comportement de DOMPurify à cet égard.

Lorsque `DOMPurify.sanitize` est utilisé dans un environnement où l'API Trusted Types est disponible et que `RETURN_TRUSTED_TYPE` est défini sur `true`, il tente de renvoyer une valeur `TrustedHTML` au lieu d'une chaîne (le comportement des options de configuration `RETURN_DOM` et `RETURN_DOM_FRAGMENT` ne change pas).

Notez que pour créer une politique dans `trustedTypes` à l'aide de DOMPurify, `RETURN_TRUSTED_TYPE: false` est requis, car `createHTML` attend une chaîne normale, pas `TrustedHTML`. L'exemple ci-dessous le montre.```js
window.trustedTypes.createPolicy('default', {
  createHTML: (to_escape) =>
    DOMPurify.sanitize(to_escape, { RETURN_TRUSTED_TYPE: false }),
});

Lorsqu'aucun TRUSTED_TYPES_POLICY n'est fourni, DOMPurify tente de créer sa propre politique Trusted Types interne nommée dompurify. Si votre page définit déjà sa propre politique avec un CSP strict (par exemple trusted-types my-organization) qui n'autorise pas une politique nommée dompurify, cette tentative est bloquée par le navigateur et enregistre un avertissement TrustedTypes policy dompurify could not be created. accompagné d'une violation CSP.

Pour empêcher DOMPurify de créer sa politique de secours interne, passez TRUSTED_TYPES_POLICY: null. C'est le bon choix lorsque vous appelez DOMPurify.sanitize depuis l'intérieur de createHTML de votre propre politique, et cela signifie que vous n'avez pas besoin d'ajouter dompurify à la liste d'autorisation trusted-types de votre CSP.```js window.trustedTypes.createPolicy('my-organization', { createHTML: (input) => DOMPurify.sanitize(input, { TRUSTED_TYPES_POLICY: null }), });

root@kitploit:~
Ne **transmettez pas** votre propre politique d'encapsulage à DOMPurify comme `TRUSTED_TYPES_POLICY` (par exemple via `DOMPurify.setConfig({ TRUSTED_TYPES_POLICY: myPolicy })`) lorsque le `createHTML` de cette politique appelle déjà `DOMPurify.sanitize`. C'est circulaire par définition - l'assainissement appellerait la politique, qui assainit en appelant à nouveau DOMPurify - et DOMPurify lèvera une `TypeError` descriptive pour empêcher la récursion infinie. Votre propre politique doit appeler DOMPurify ; DOMPurify ne doit pas être configuré pour appeler votre politique.

Si vous souhaitez que ce modèle de politique `default` soit appliqué automatiquement à une page entière - afin que chaque puits HTML soit assaini, y compris le code hérité, les widgets tiers et les milliers d'affectations `innerHTML` que vous ne pouvez pas facilement trouver ou réécrire - jetez un œil à [DOMFortify](https://github.com/cure53/DOMFortify). Il installe exactement une telle politique `default` de Trusted Types adossée à DOMPurify et refuse catégoriquement les puits de script (`eval`, `script.src`, ...). C'est un projet délibérément séparé : DOMPurify reste un assainisseur ciblé, et DOMFortify gère la couche d'application à l'échelle du document qui est intentionnellement hors du périmètre de DOMPurify.

## Puis-je configurer DOMPurify ?

Oui. Les valeurs de configuration par défaut incluses sont déjà plutôt bonnes - mais vous pouvez bien sûr les remplacer. Consultez le dossier [`/demos`](https://github.com/cure53/DOMPurify/tree/main/demos) pour voir une série d'exemples sur la façon de [personnaliser DOMPurify](https://github.com/cure53/DOMPurify/tree/main/demos#what-is-this).

Avant d'élargir la liste d'autorisation (`ADD_TAGS`, `ADD_ATTR`, `CUSTOM_ELEMENT_HANDLING`, …) ou d'assouplir une valeur par défaut, il vaut la peine de parcourir [les balises et attributs à considérer deux fois](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model#dangerous-tags-and-attributes-think-twice-before-allow-listing) - certains sont dangereux de manières non évidentes.

### Paramètres généraux```js
// strip {{ ... }}, ${ ... } and <% ... %> to make output safe for template systems
// be careful please, this mode is not recommended for production usage.
// allowing template parsing in user-controlled HTML is not advised at all.
// only use this mode if there is really no alternative.
const clean = DOMPurify.sanitize(dirty, { SAFE_FOR_TEMPLATES: true });

// change how e.g. comments containing risky HTML characters are treated.
// be very careful, this setting should only be set to `false` if you really only handle
// HTML and nothing else, no SVG, MathML or the like.
// Otherwise, changing from `true` to `false` will lead to XSS in this or some other way.
const clean = DOMPurify.sanitize(dirty, { SAFE_FOR_XML: false });

Contrôler nos listes d'autorisation et de blocage```js

// allow only elements, very strict const clean = DOMPurify.sanitize(dirty, { ALLOWED_TAGS: ['b'] });

// allow only and with style attributes const clean = DOMPurify.sanitize(dirty, { ALLOWED_TAGS: ['b', 'q'], ALLOWED_ATTR: ['style'], });

// allow all safe HTML elements but neither SVG nor MathML // note that the USE_PROFILES setting will override the ALLOWED_TAGS setting // so don't use them together const clean = DOMPurify.sanitize(dirty, { USE_PROFILES: { html: true } });

// allow all safe SVG elements and SVG Filters, no HTML or MathML const clean = DOMPurify.sanitize(dirty, { USE_PROFILES: { svg: true, svgFilters: true }, });

// allow all safe MathML elements and SVG, but no SVG Filters const clean = DOMPurify.sanitize(dirty, { USE_PROFILES: { mathMl: true, svg: true }, });

// change the default namespace from HTML to something different const clean = DOMPurify.sanitize(dirty, { NAMESPACE: 'http://www.w3.org/2000/svg', });

// leave all safe HTML as it is and add elements to block-list const clean = DOMPurify.sanitize(dirty, { FORBID_TAGS: ['style'] });

// leave all safe HTML as it is and add style attributes to block-list const clean = DOMPurify.sanitize(dirty, { FORBID_ATTR: ['style'] });

// extend the existing array of allowed tags and add to allow-list const clean = DOMPurify.sanitize(dirty, { ADD_TAGS: ['my-tag'] });

// extend the existing array of allowed attributes and add my-attr to allow-list const clean = DOMPurify.sanitize(dirty, { ADD_ATTR: ['my-attr'] });

// use functions to control which additional tags and attributes are allowed const allowlist = { one: ['attribute-one'], two: ['attribute-two'], }; const clean = DOMPurify.sanitize( '', { ADD_TAGS: (tagName) => { return Object.keys(allowlist).includes(tagName); }, ADD_ATTR: (attributeName, tagName) => { return allowlist[tagName]?.includes(attributeName) || false; }, } ); //

// prohibit ARIA attributes, leave other safe HTML as is (default is true) const clean = DOMPurify.sanitize(dirty, { ALLOW_ARIA_ATTR: false });

// prohibit HTML5 data attributes, leave other safe HTML as is (default is true) const clean = DOMPurify.sanitize(dirty, { ALLOW_DATA_ATTR: false });

root@kitploit:~
### Contrôle du comportement relatif aux éléments personnalisés```js
// DOMPurify allows to define rules for Custom Elements. When using the CUSTOM_ELEMENT_HANDLING
// literal, it is possible to define exactly what elements you wish to allow (by default, none are allowed).
//
// The same goes for their attributes. By default, the built-in or configured allow.list is used.
//
// You can use a RegExp literal to specify what is allowed or a predicate, examples for both can be seen below.
// When using a predicate function for attributeNameCheck, it can optionally receive the tagName as a second parameter
// for more granular control over which attributes are allowed for specific elements.
// The default values are very restrictive to prevent accidental XSS bypasses. Handle with great care!

const clean = DOMPurify.sanitize(
  '<foo-bar baz="foobar" forbidden="true"></foo-bar><div is="foo-baz"></div>',
  {
    CUSTOM_ELEMENT_HANDLING: {
      tagNameCheck: null, // no custom elements are allowed
      attributeNameCheck: null, // default / standard attribute allow-list is used
      allowCustomizedBuiltInElements: false, // no customized built-ins allowed
    },
  }
); // <div is=""></div>

const clean = DOMPurify.sanitize(
  '<foo-bar baz="foobar" forbidden="true"></foo-bar><div is="foo-baz"></div>',
  {
    CUSTOM_ELEMENT_HANDLING: {
      tagNameCheck: /^foo-/, // allow all tags starting with "foo-"
      attributeNameCheck: /baz/, // allow all attributes containing "baz"
      allowCustomizedBuiltInElements: true, // customized built-ins are allowed
    },
  }
); // <foo-bar baz="foobar"></foo-bar><div is="foo-baz"></div>

const clean = DOMPurify.sanitize(
  '<foo-bar baz="foobar" forbidden="true"></foo-bar><div is="foo-baz"></div>',
  {
    CUSTOM_ELEMENT_HANDLING: {
      tagNameCheck: (tagName) => tagName.match(/^foo-/), // allow all tags starting with "foo-"
      attributeNameCheck: (attr) => attr.match(/baz/), // allow all containing "baz"
      allowCustomizedBuiltInElements: true, // allow customized built-ins
    },
  }
); // <foo-bar baz="foobar"></foo-bar><div is="foo-baz"></div>

// Example with attributeNameCheck receiving tagName as a second parameter
const clean = DOMPurify.sanitize(
  '<element-one attribute-one="1" attribute-two="2"></element-one><element-two attribute-one="1" attribute-two="2"></element-two>',
  {
    CUSTOM_ELEMENT_HANDLING: {
      tagNameCheck: (tagName) => tagName.match(/^element-(one|two)$/),
      attributeNameCheck: (attr, tagName) => {
        if (tagName === 'element-one') {
          return ['attribute-one'].includes(attr);
        } else if (tagName === 'element-two') {
          return ['attribute-two'].includes(attr);
        } else {
          return false;
        }
      },
      allowCustomizedBuiltInElements: false,
    },
  }
); // <element-one attribute-one="1"></element-one><element-two attribute-two="2"></element-two>
Télécharger l’outil

Contrôle du comportement relatif aux valeurs URI```js

// extend the existing array of elements that can use Data URIs const clean = DOMPurify.sanitize(dirty, { ADD_DATA_URI_TAGS: ['a', 'area'] });

// extend the existing array of elements that are safe for URI-like values (be careful, XSS risk) const clean = DOMPurify.sanitize(dirty, { ADD_URI_SAFE_ATTR: ['my-attr'] });

root@kitploit:~
### Contrôler les valeurs d'attribut autorisées```js
// allow external protocol handlers in URL attributes (default is false, be careful, XSS risk)
// by default only http, https, ftp, ftps, tel, mailto, callto, sms, cid, xmpp and matrix are allowed.
const clean = DOMPurify.sanitize(dirty, { ALLOW_UNKNOWN_PROTOCOLS: true });

// allow specific protocol handlers in URL attributes via regex (default is false, be careful, XSS risk)
// by default only (protocol-)relative URLs, http, https, ftp, ftps, tel, mailto, callto, sms, cid, xmpp and matrix are allowed.
// Default RegExp: /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i;
const clean = DOMPurify.sanitize(dirty, {
  ALLOWED_URI_REGEXP:
    /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i,
});

Influencer le type de retour```js

// return a DOM HTMLBodyElement instead of an HTML string (default is false) const clean = DOMPurify.sanitize(dirty, { RETURN_DOM: true });

// return a DOM DocumentFragment instead of an HTML string (default is false) const clean = DOMPurify.sanitize(dirty, { RETURN_DOM_FRAGMENT: true });

// use the RETURN_TRUSTED_TYPE flag to turn on Trusted Types support if available const clean = DOMPurify.sanitize(dirty, { RETURN_TRUSTED_TYPE: true }); // will return a TrustedHTML object instead of a string if possible

// use a provided Trusted Types policy const clean = DOMPurify.sanitize(dirty, { // supplied policy must define createHTML and createScriptURL TRUSTED_TYPES_POLICY: trustedTypes.createPolicy('dompurify', { createHTML(s) { return s; }, createScriptURL(s) { return s; }, }), });

// opt out of DOMPurify's internal dompurify Trusted Types policy entirely // (useful when your CSP trusted-types allowlist does not include dompurify) const clean = DOMPurify.sanitize(dirty, { TRUSTED_TYPES_POLICY: null });

root@kitploit:~
### Influencer la façon dont nous assainissons```js
// return entire document including <html> tags (default is false)
const clean = DOMPurify.sanitize(dirty, { WHOLE_DOCUMENT: true });

// disable DOM Clobbering protection on output (default is true, handle with care, minor XSS risks here)
const clean = DOMPurify.sanitize(dirty, { SANITIZE_DOM: false });

// enforce strict DOM Clobbering protection via namespace isolation (default is false)
// when enabled, isolates the namespace of named properties (i.e., `id` and `name` attributes)
// from JS variables by prefixing them with the string `user-content-`
const clean = DOMPurify.sanitize(dirty, { SANITIZE_NAMED_PROPS: true });

// keep an element's content when the element is removed (default is true)
const clean = DOMPurify.sanitize(dirty, { KEEP_CONTENT: false });

// glue elements like style, script or others to document.body and prevent unintuitive browser behavior in several edge-cases (default is false)
const clean = DOMPurify.sanitize(dirty, { FORCE_BODY: true });

// remove all <a> elements under <p> elements that are removed
const clean = DOMPurify.sanitize(dirty, {
  FORBID_CONTENTS: ['a'],
  FORBID_TAGS: ['p'],
});

// extend the default FORBID_CONTENTS list to also remove <a> elements under <p> elements
const clean = DOMPurify.sanitize(dirty, {
  ADD_FORBID_CONTENTS: ['a'],
  FORBID_TAGS: ['p'],
});

// change the parser type so sanitized data is treated as XML and not as HTML, which is the default
const clean = DOMPurify.sanitize(dirty, {
  PARSER_MEDIA_TYPE: 'application/xhtml+xml',
});

Influencer l'endroit où nous assainissons```js

// use the IN_PLACE mode to sanitize a node "in place", which is much faster depending on how you use DOMPurify const dirty = document.createElement('a'); dirty.setAttribute('href', 'javascript:alert(1)');

const clean = DOMPurify.sanitize(dirty, { IN_PLACE: true }); // see https://github.com/cure53/DOMPurify/issues/288 for more info

root@kitploit:~
There is even [more examples here](https://github.com/cure53/DOMPurify/tree/main/demos#what-is-this), showing how you can run, customize and configure DOMPurify to fit your needs.

## Persistent Configuration

Instead of repeatedly passing the same configuration to `DOMPurify.sanitize`, you can use the `DOMPurify.setConfig` method. Your configuration will persist until your next call to `DOMPurify.setConfig`, or until you invoke `DOMPurify.clearConfig` to reset it. Remember that there is only one active configuration, which means once it is set, all extra configuration parameters passed to `DOMPurify.sanitize` are ignored.

## Hooks

DOMPurify allows you to augment its functionality by attaching one or more functions with the `DOMPurify.addHook` method to one of the following hooks:

- `beforeSanitizeElements`
- `uponSanitizeElement` (Pas de « s » - appelé pour chaque élément)
- `afterSanitizeElements`
- `beforeSanitizeAttributes`
- `uponSanitizeAttribute`
- `afterSanitizeAttributes`
- `beforeSanitizeShadowDOM`
- `uponSanitizeShadowNode`
- `afterSanitizeShadowDOM`

It passes the currently processed DOM node, when needed a literal with verified node and attribute data and the DOMPurify configuration to the callback. Check out the [MentalJS hook demo](https://github.com/cure53/DOMPurify/blob/main/demos/hooks-mentaljs-demo.html) to see how the API can be used nicely.

_Example_ :```js
DOMPurify.addHook(
  'uponSanitizeAttribute',
  function (currentNode, hookEvent, config) {
    // Do something with the current node
    // You can also mutate hookEvent for current node (i.e. set hookEvent.forceKeepAttr = true)
    // For other than 'uponSanitizeAttribute' hook types hookEvent equals to null
  }
);

Une note sur l'appel de sanitize() depuis un hook

DOMPurify.sanitize() n'est pas réentrant. Veuillez ne pas l'appeler depuis l'intérieur d'un hook, ni depuis un rappel de configuration tel que CUSTOM_ELEMENT_HANDLING.tagNameCheck ou attributeNameCheck. Ces rappels s'exécutent au milieu d'une passe d'assainissement active.

Un appel imbriqué à sanitize() relit la configuration qui lui est transmise et, ce faisant, remplace la configuration que la passe externe utilise encore. Le reste du document externe est ensuite assaini selon la configuration de l'appel imbriqué au lieu de la vôtre. Comme l'appel imbriqué s'exécute généralement avec la configuration par défaut, une liste d'autorisation ALLOWED_TAGS stricte peut silencieusement s'élargir à nouveau vers celle par défaut au milieu d'un document, sans erreur ni avertissement.

Si vous devez assainir du balisage imbriqué, par exemple un fragment HTML contenu dans une valeur d'attribut, vous avez deux options sûres. Soit définir votre configuration une fois avec DOMPurify.setConfig au lieu de la passer à chaque appel, car une configuration persistante est partagée par l'appel imbriqué et reste en vigueur pendant toute la passe ; soit collecter les fragments pendant le hook et les assainir avec un appel sanitize() séparé après le retour de l'appel externe.

Configuration supprimée

OptionDepuisRemarque
SAFE_FOR_JQUERY2.1.0Aucun remplacement nécessaire.

Intégration continue

Nous utilisons actuellement GitHub Actions en combinaison avec Playwright. Cela nous permet de confirmer à chaque commit que tout fonctionne dans les navigateurs modernes concernés, et un flux de travail séparé, planifié et déclenché lors des fusions, ré-exécute la suite sur des instantanés d'anciens moteurs afin que les régressions sur les navigateurs obsolètes soient également détectées. Consultez les journaux de build ici : https://github.com/cure53/DOMPurify/actions

Vous pouvez également exécuter des tests locaux en lançant npm run test.

Tous les commits pertinents seront signés avec la clé 0x24BB6BF4 pour une sécurité supplémentaire (depuis le 8 avril 2016).

Développement et contribution

Installation (npm i)

Nous prenons officiellement en charge npm. Le flux de travail GitHub Actions est configuré pour installer les dépendances avec npm. Lors de l'utilisation d'une version obsolète de npm, nous ne pouvons pas garantir entièrement les versions des dépendances installées, ce qui peut entraîner des problèmes imprévus.

Scripts

Nous utilisons ESLint via xo dans le cadre de notre workflow de pré-commit pour aider à garantir la cohérence du code. De plus, nous utilisons Prettier pour le formatage des sources et du Markdown, et les ressources /dist sont générées via rollup.

Voici nos scripts npm :

  • npm run dev pour générer le bundle UMD non minifié tout en surveillant les sources pour détecter les modifications
  • npm run test pour linter les sources, exécuter les tests via jsdom et exécuter les tests navigateur dans Chromium via Playwright
    • npm run test:jsdom pour exécuter uniquement les tests via jsdom
    • npm run test:happydom pour exécuter la suite avec happy-dom (un environnement non pris en charge ; conservé comme test de robustesse, et non comme une promesse de compatibilité)
    • npm run test:browser pour exécuter uniquement les tests via Playwright
    • npm run test:browser:legacy pour exécuter la suite sur d'anciens moteurs de navigateur (pointez PW_MODULE vers une ancienne installation Playwright épinglée ; voir .github/workflows/legacy-browsers.yml)
    • npm run test:ci pour exécuter le flux de tests CI pour jsdom et Playwright
    • npm run test:fuzz pour exécuter un petit fuzzer couvrant sanitize() et CONFIG
  • npm run bench pour exécuter le micro-benchmark jsdom sur le dist/purify.cjs généré (construisez d'abord ; --json et --compare a.json b.json prennent en charge les exécutions A/B entre les branches - les résultats sont indicatifs, confirmez les affirmations destinées aux utilisateurs dans de vrais navigateurs)
  • npm run coverage pour générer un bundle instrumenté, exécuter la suite jsdom et écrire un rapport local de couverture de lignes/branches en HTML dans coverage/index.html (portée jsdom uniquement, non exécuté en CI)
    • npm run build:cov pour générer uniquement le bundle de couverture instrumenté
  • npm run lint pour linter les sources avec ESLint via xo
  • npm run format pour formater les sources JavaScript/TypeScript et Markdown avec Prettier
    • npm run format:js pour formater uniquement les sources JavaScript/TypeScript
    • npm run format:md pour formater uniquement les fichiers Markdown
  • npm run build pour générer les déclarations de types et les bundles de distribution, puis corriger et nettoyer les types générés
    • npm run build:types pour émettre uniquement les fichiers de déclaration TypeScript
    • npm run build:rollup pour générer tous les bundles Rollup
    • npm run build:umd pour générer uniquement un bundle UMD non minifié
    • npm run build:umd:min pour générer uniquement un bundle UMD minifié
    • npm run build:es pour générer uniquement le bundle de module ES
    • npm run build:cjs pour générer uniquement le bundle CommonJS
    • npm run build:fix-types pour post-traiter les fichiers de types générés
    • npm run build:cleanup pour nettoyer la sortie temporaire des types générés
  • npm run verify-typescript pour exécuter le script de vérification TypeScript
  • npm run commit-amend-build pour exécuter le script d'aide du mainteneur afin d'amender la sortie de build

Remarque : tous les scripts d'exécution sont déclenchés via npm run <script>.

Il existe d'autres scripts npm, mais ils servent principalement à s'intégrer avec la CI ou sont destinés à être « privés », par exemple pour modifier les fichiers de distribution du build à chaque commit.

Liste de diffusion de sécurité

Nous tenons une liste de diffusion qui notifie chaque fois qu'une version critique pour la sécurité de DOMPurify est publiée. Cela signifie que si quelqu'un a trouvé un contournement et que nous l'avons corrigé avec une version (ce qui arrive toujours lorsqu'un contournement est trouvé), un courriel sera envoyé à cette liste. Cela se produit généralement en quelques minutes ou quelques heures après avoir eu connaissance d'un contournement. Vous pouvez vous abonner à la liste ici :

https://lists.ruhr-uni-bochum.de/mailman/listinfo/dompurify-security

Les versions de fonctionnalités ne seront pas annoncées sur cette liste.

Qui a contribué ?

De nombreuses personnes ont aidé DOMPurify à devenir ce qu'il est aujourd'hui, et elles méritent d'être reconnues !

offset, Bankde, lukewarlow, DEMON1A, fg0x0, kodareef5, DavidOliver, 1Jesper1, bencalif, trace37labs, eddieran, christos-eth, researchatfluidattacks, frevadiscor, Rotzbua, binhpv, MariusRumpf, prasadrajandran, Cybozu 💛💸, hata6502 💸, openclaw 💸, intra-mart-dh 💸, nelstrom ❤️, hash_kitten ❤️, kevin_mizu ❤️, icesfont ❤️, reduckted ❤️, dcramer 💸, JGraph 💸, baekilda 💸, Healthchecks 💸, Sentry 💸, jarrodldavis 💸, CynegeticIO, ssi02014 ❤️, GrantGryczan, Lowdefy, granlem, oreoshake, tdeekens ❤️, peernohell ❤️, is2ei, SoheilKhodayari, franktopel, NateScarlet, neilj, fhemberger, Joris-van-der-Wel, ydaniv, terjanq, filedescriptor, ConradIrwin, gibson042, choumx, 0xSobky, styfle, koto, tlau88, strugee, oparoz, mathiasbynens, edg2s, dnkolegov, dhardtke, wirehead, thorn0, styu, mozfreddyb ❤️, mikesamuel, jorangreef, jimmyhchan, jameydeorio, jameskraus, hyderali, hansottowirtz, hackvertor, freddyb, flavorjones, djfarrelly, devd, camerondunford, buu700, buildog, alabiaga, Vector919, Robbert, GreLI, FuzzySockets, ArtemBernatskyy, @garethheyes, @shafigullin, @mmrupp, @irsdl,ShikariSenpai, ansjdnakjdnajkd, @asutherland, @mathias, @cgvwzq, @robbertatwork, @giutro, @CmdEngineer_, @avr4mit, davecardwell, Develop-KIM, asamuzaK, fishjojo1 ❤️, Rikuxx0, donmccurdy, hhk-png, elrion018, michalnieruchalski-tiugo, reey, KanhaKanhaiya, odaysec, Akokonunes, alirezarouhbakhsh, Jaybhade et tout particulièrement @securitymb ❤️ & @masatokinugawa ❤️