
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 :
DOMPurify est un assainisseur XSS ultra-rapide, ultra-tolérant et exclusivement basé sur le DOM 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.15.
DOMPurify fonctionne en JavaScript et est compatible avec tous les navigateurs modernes (Safari (10+), Opera (15+), Edge, Firefox et Chrome — ainsi qu'avec presque tout ce qui utilise Blink, Gecko ou WebKit). Il ne casse pas sur MSIE ou d'autres navigateurs hérités. Il ne fait 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 distincte réexécute la suite sur des instantanés de moteurs plus anciens (remontant à environ Chromium 110, Firefox 108 et WebKit 16.4, soit environ trois ans) afin que les régressions sur les navigateurs obsolètes soient également détectées. Nous exécutons également Node.js v20, v22, v24, v25 et v26 avec DOMPurify sur jsdom. Les versions plus anciennes de Node sont également connues pour fonctionner, mais bon... aucune garantie.
DOMPurify est écrit par des experts en sécurité possédant une vaste expérience des attaques web et du XSS. N'ayez crainte. Pour plus de détails, veuillez également lire notre Modèle de menaces et objectifs de sécurité. Lisez-le, vraiment. Et si vous appréciez les détails sanglants, la page Classes d'attaques et historique des contournements catalogue les astuces de mutation du parseur, de namespace, de clobbering et de template 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.
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 renverra 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 nuisances. C'est aussi 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.
C'est simple. Il suffit d'inclure DOMPurify sur votre site web.
### 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);
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>');
Le HTML résultant peut être écrit dans un élément du DOM via innerHTML ou dans le DOM via document.write(). Cela dépend entièrement de vous.
Notez que par défaut, nous autorisons le HTML, le SVG et le MathML. Si vous n'avez besoin que du HTML, ce qui peut être un cas d'usage très courant, vous pouvez facilement le configurer également :```js
const clean = DOMPurify.sanitize(dirty, { USE_PROFILES: { html: true } });
### Y a-t-il un risque de tir dans le pied ?
Eh bien, veuillez noter que si vous _d'abord_ assainissez le HTML puis le modifiez _ensuite_, vous risquez facilement **d'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 bricole pas le HTML de son côté. Consultez les [Objectifs de sécurité et modèle de menace](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model) pour des recettes d'utilisation sûres et les balises/attributs à examiner de plus près, ainsi que les [Classes d'attaques et historique des contournements](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 consulter la propriété `DOMPurify.removed` pour 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
DOMPurify fonctionne techniquement aussi 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 côté 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 fortement** d'utiliser la dernière version de _jsdom_.
Pourquoi ? Parce que les anciennes versions de _jsdom_ sont connues pour être boguées d'une manière qui entraîne des XSS _même si_ DOMPurify fait tout correctement à 100 %. Il existe des **vecteurs d'attaque connus**, par exemple dans _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** à ce stade. 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 les [Classes d'attaques et historique des contournements](https://github.com/cure53/DOMPurify/wiki/Attack-Classes-&-Bypass-History).
À part cela, vous pouvez utiliser DOMPurify côté serveur sans problème. 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');
Ou même ceci, si vous préférez travailler avec des 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 rencontrez des problèmes pour le faire fonctionner dans votre configuration spécifique, pensez à consulter l'excellent projet isomorphic-dompurify qui résout de nombreux problèmes que les utilisateurs peuvent rencontrer.```bash npm install isomorphic-dompurify
Aucun contenu fourni.```js
import DOMPurify from 'isomorphic-dompurify';
const clean = DOMPurify.sanitize('<s>hello</s>');
Bien sûr qu'il y a une démo ! Jouez avec DOMPurify
Tout d'abord, veuillez nous contacter immédiatement par email afin que nous puissions travailler sur un correctif. Clé PGP
De plus, vous êtes probablement éligible à un programme de bug bounty ! Les braves gens de chez Fastmail utilisent DOMPurify pour leurs services et ont ajouté notre bibliothèque au périmètre de leur bug bounty. Donc, si vous trouvez un moyen de contourner ou d'affaiblir DOMPurify, veuillez également consulter leur site web et les informations sur le bug bounty.
À quoi ressemble un balisage purifié ? Eh bien, la démo le montre pour un grand nombre d'éléments nuisibles. Mais montrons aussi quelques exemples plus petits !```js
DOMPurify.sanitize(''); // becomes
DOMPurify.sanitize('<g/onload=alert(2)//
'); // becomes DOMPurify.sanitize('
abcdef
abc
| HELLO |
| HELLO |
Voici un aperçu. Pour la taxonomie complète des classes d'attaques dont proviennent ces échantillons — mutation XSS, confusion d'espaces de noms, clobbering DOM, échappements 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 les CSS et les attributs de données personnalisés HTML. DOMPurify prend également en charge le Shadow DOM — et assainit les modèles DOM de manière récursive. DOMPurify vous permet aussi d'assainir du HTML pour une utilisation avec les API jQuery `$()` et `elm.html()` sans aucun problème connu. Pour l'ensemble exact 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 navigateurs hérités 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 élaborer 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 indicateur 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, et non `TrustedHTML`. L'exemple ci-dessous illustre cela.```js
window.trustedTypes.createPolicy('default', {
createHTML: (to_escape) =>
DOMPurify.sanitize(to_escape, { RETURN_TRUSTED_TYPE: false }),
});
Lorsqu'aucune TRUSTED_TYPES_POLICY n'est fournie, DOMPurify tente de créer sa propre politique interne Trusted Types nommée dompurify. Si votre page définit déjà sa propre politique accompagnée d'une CSP stricte (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. ainsi qu'une violation de la CSP.
Pour empêcher DOMPurify de créer sa politique de secours interne, transmettez TRUSTED_TYPES_POLICY: null. C'est le bon choix lorsque vous appelez DOMPurify.sanitize depuis l'intérieur du 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 }),
});
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` difficiles à trouver ou à réécrire — jetez un œil à [DOMFortify](https://github.com/cure53/DOMFortify). Il installe exactement une telle politique Trusted Types `default` adossée à DOMPurify et refuse les puits de script (`eval`, `script.src`, …) sans appel. C’est volontairement un projet séparé : DOMPurify reste un assainisseur ciblé, et DOMFortify gère la couche d’application à l’échelle du document qui sort intentionnellement 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 de nombreux 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 avec prudence](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model#dangerous-tags-and-attributes-think-twice-before-allow-listing) — certains sont dangereux de manière non évidente.
### 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 });
// 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 });
### Comportement de contrôle 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>
// 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'] });
### 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,
});
// 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 });
### Influencez 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',
});
// 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
Il existe même [d'autres exemples ici](https://github.com/cure53/DOMPurify/tree/main/demos#what-is-this), montrant comment vous pouvez exécuter, personnaliser et configurer DOMPurify pour répondre à vos besoins.
## Configuration persistante
Au lieu de transmettre à plusieurs reprises la même configuration à `DOMPurify.sanitize`, vous pouvez utiliser la méthode `DOMPurify.setConfig`. Votre configuration persistera jusqu'à votre prochain appel à `DOMPurify.setConfig`, ou jusqu'à ce que vous invoquiez `DOMPurify.clearConfig` pour la réinitialiser. N'oubliez pas qu'il n'existe qu'une seule configuration active, ce qui signifie qu'une fois définie, tous les paramètres de configuration supplémentaires transmis à `DOMPurify.sanitize` sont ignorés.
## Hooks
DOMPurify vous permet d'augmenter ses fonctionnalités en attachant une ou plusieurs fonctions avec la méthode `DOMPurify.addHook` à l'un des hooks suivants :
- `beforeSanitizeElements`
- `uponSanitizeElement` (sans 's' - appelé pour chaque élément)
- `afterSanitizeElements`
- `beforeSanitizeAttributes`
- `uponSanitizeAttribute`
- `afterSanitizeAttributes`
- `beforeSanitizeShadowDOM`
- `uponSanitizeShadowNode`
- `afterSanitizeShadowDOM`
Il transmet le nœud DOM actuellement traité, si nécessaire un littéral avec les données vérifiées du nœud et de l'attribut, ainsi que la configuration DOMPurify au rappel. Consultez la [démo du hook MentalJS](https://github.com/cure53/DOMPurify/blob/main/demos/hooks-mentaljs-demo.html) pour voir comment l'API peut être utilisée de manière élégante.
_Exemple_ :```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
}
);
sanitize() depuis un hookDOMPurify.sanitize() n'est pas réentrant. Veuillez ne pas l'appeler depuis un hook, ni depuis un callback de configuration tel que CUSTOM_ELEMENT_HANDLING.tagNameCheck ou attributeNameCheck. Ces callbacks s'exécutent au milieu d'une passe d'assainissement active.
Un appel sanitize() imbriqué 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 stricte ALLOWED_TAGS peut silencieusement s'élargir pour revenir à celle par défaut en plein 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 seule fois avec DOMPurify.setConfig au lieu de la transmettre à chaque appel, car une configuration persistante est partagée par l'appel imbriqué et reste en vigueur pour 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.
| Option | Depuis | Remarque |
|---|---|---|
| SAFE_FOR_JQUERY | 2.1.0 | Aucun remplacement requis. |
Nous utilisons actuellement GitHub Actions en combinaison avec Playwright. Cela nous permet de confirmer à chaque commit que tout fonctionne dans les navigateurs modernes pertinents, et un workflow distinct planifié et déclenché lors des fusions relance 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).
npm i)Nous prenons officiellement en charge npm. Le workflow GitHub Actions est configuré pour installer les dépendances avec npm. Lorsque vous utilisez une version obsolète de npm, nous ne pouvons pas garantir pleinement les versions des dépendances installées, ce qui peut entraîner des problèmes imprévus.
Nous utilisons ESLint via xo dans le cadre de notre workflow de pré-commit pour garantir la cohérence du code. De plus, nous utilisons Prettier pour le formatage des sources et du Markdown, et les ressources /dist sont construites via rollup.
Voici nos scripts npm :
npm run dev pour construire le bundle UMD non minifié tout en surveillant les modifications des sourcesnpm 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 jsdomnpm run test:happydom pour exécuter la suite via happy-dom (un environnement non pris en charge ; conservé comme contrôle de robustesse, pas comme promesse de compatibilité)npm run test:browser pour exécuter uniquement les tests via Playwrightnpm 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 Playwrightnpm run test:fuzz pour exécuter un petit fuzzer couvrant sanitize() et CONFIGRemarque : tous les scripts sont exécutés via npm run <script>.
Il existe d'autres scripts npm, mais ils servent principalement à l'intégration avec la CI ou sont destinés à être « privés », par exemple pour amender les fichiers de distribution construits à chaque commit.
Nous maintenons 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 trouve un contournement et que nous le corrigeons avec une version (ce qui arrive toujours lorsqu'un contournement est découvert), un courriel est envoyé à cette liste. Cela se produit généralement en quelques minutes ou quelques heures après avoir pris connaissance du 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.
De nombreuses personnes ont aidé DOMPurify à devenir ce qu'il est aujourd'hui, et elles méritent d'être reconnues !
gnyselcuk, leechristensen,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 💸, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,, , , , , , , , , , , , , , , , , , , , , , , et surtout &
npm run bench pour exécuter le micro-benchmark jsdom sur le dist/purify.cjs construit (construisez d'abord ; --json et --compare a.json b.json prennent en charge les exécutions A/B entre branches — les résultats sont indicatifs, confirmez les affirmations destinées aux utilisateurs dans de vrais navigateurs)npm run coverage pour construire un bundle instrumenté, exécuter la suite jsdom et écrire un rapport local HTML de couverture de lignes/branches dans coverage/index.html (portée jsdom uniquement, non exécuté en CI)
npm run build:cov pour construire uniquement le bundle de couverture instrumenténpm run lint pour linter les sources avec ESLint via xonpm run format pour formater les sources JavaScript/TypeScript et Markdown avec Prettier
npm run format:js pour formater uniquement les sources JavaScript/TypeScriptnpm run format:md pour formater uniquement les fichiers Markdownnpm run build pour construire 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 TypeScriptnpm run build:rollup pour construire tous les bundles Rollupnpm run build:umd pour construire uniquement un bundle UMD non minifiénpm run build:umd:min pour construire uniquement un bundle UMD minifiénpm run build:es pour construire uniquement le bundle de module ESnpm run build:cjs pour construire uniquement le bundle CommonJSnpm run build:fix-types pour post-traiter les fichiers de types générésnpm run build:cleanup pour nettoyer la sortie temporaire des types générésnpm run verify-typescript pour exécuter le script de vérification TypeScriptnpm run commit-amend-build pour exécuter le script d'assistance du mainteneur pour amender la sortie de build