73 votes

Prévention des XSS dans Node.js / javascript côté serveur

Une idée sur la façon de prévenir les attaques XSS sur une application node.js ? Existe-t-il des librairies qui permettent de supprimer le javascript dans les hrefs, les attributs onclick, etc. des données POSTed ?

Je ne veux pas avoir à écrire une regex pour tout ça :)

Des suggestions ?

57voto

theSmaw Points 430

J'ai créé un module qui regroupe le Caja HTML Sanitizer.

npm install sanitizer

http://github.com/theSmaw/Caja-HTML-Sanitizer

https://www.npmjs.com/package/sanitizer

Tout commentaire est apprécié.

4 votes

Utilisation de require('sanitizer').sanitize supprime tous les a[href] plutôt que seulement les vilains. Pour notre cas d'utilisation, nous avons besoin que les liens soient toujours acceptés (mais pas les liens vilains, ni les autres vilains du xss, etc.), des suggestions ?

25voto

ssokolow Points 6549

Une des réponses à Assainir/réécrire le HTML côté client suggère d'emprunter le sanitizer HTML en JS basé sur la liste blanche de Google Caja qui, d'après ce que j'ai pu voir en parcourant rapidement le site, implémente un analyseur HTML SAX sans s'appuyer sur le DOM du navigateur.

Mise à jour : N'oubliez pas non plus que le désinfectant Caja a apparemment fait l'objet d'un examen de sécurité complet et professionnel, alors que les regex sont connus pour être très faciles à taper de manière à compromettre la sécurité.

Mise à jour 2017-09-24 : Il y a aussi maintenant DOMPurify . Je ne l'ai pas encore utilisé, mais il semble qu'il réponde ou dépasse tous les points que je recherche :

  • S'appuie sur les fonctionnalités fournies par l'environnement d'exécution dans la mesure du possible. (Important à la fois pour les performances et pour maximiser la sécurité en s'appuyant autant que possible sur des implémentations matures et bien testées).

    • S'appuie sur le DOM du navigateur ou sur le système de gestion des données. jsdom pour Node.JS.
  • Configuration par défaut conçue pour dépouiller le moins possible tout en garantissant la suppression du javascript.

    • Prise en charge de HTML, MathML et SVG
    • On en revient au système propriétaire et non configurable de Microsoft. toStaticHTML sous IE8 et IE9.
  • Hautement configurable, il convient pour imposer des limites à une entrée qui peut contenir du HTML arbitraire, comme un champ de commentaires WYSIWYG ou Markdown. (En fait, c'est le haut de la pile ici)

    • Prise en charge de la liste blanche et de la liste noire habituelles pour les balises et les attributs, ainsi que de la liste blanche pour les regex URL.
    • Dispose d'options spéciales permettant d'assainir davantage certains types courants de métacaractères de modèles HTML.
  • Ils prennent au sérieux la compatibilité et la fiabilité

    • Tests automatisés fonctionnant sur 16 navigateurs différents ainsi que sur trois versions majeures différentes de Node.JS.
    • Pour s'assurer que les développeurs et les hôtes CI sont tous sur la même longueur d'onde, des fichiers de verrouillage sont publiés.

0 votes

Merci, j'ai pratiquement tout compris avec regex (beurk) - mais j'aimerais bien envisager la création d'un middleware de connexion pour aseptiser tous les paramètres.

21voto

porneL Points 42805

Toutes les techniques habituelles s'appliquent également à la sortie de node.js, ce qui signifie :

  • Les listes noires ne fonctionnent pas.
  • Vous n'êtes pas censé filtrer l'entrée afin de protéger la sortie HTML. Cela ne fonctionnera pas ou fonctionnera en déformant inutilement les données.
  • Vous êtes censé corriger le texte en HTML.

Je ne suis pas sûr que node.js soit livré avec une fonction intégrée pour cela, mais quelque chose comme ça devrait faire l'affaire :

function htmlEscape(text) {
   return text.replace(/&/g, '&').
     replace(/</g, '&lt;').  // it's not neccessary to escape >
     replace(/"/g, '&quot;').
     replace(/'/g, '&#039;');
}

3 votes

"Vous n'êtes pas censé filtrer les entrées" ... "Vous êtes censé effacer le code HTML... de la sortie" : Avez-vous une référence pour cette proposition de meilleure pratique ?

1 votes

@DanielFlippance ces deux points sont une conséquence logique de "vous êtes supposé échapper à la sortie HTML" et c'est la spécification HTML.

1 votes

Ne pas filtrer les entrées utilisateur est une "meilleure pratique" risquée. Vous ouvrez la porte aux erreurs des développeurs et, dans un grand projet, aux erreurs des développeurs. sera se produisent, donc vous serez piraté encore et encore. Gardez cela à l'esprit si vous décidez de suivre cette voie.

15voto

Baggz Points 6836

J'ai récemment découvert validateur de nœuds par chriso .

Exemple

get('/', function (req, res) {

  //Sanitize user input
  req.sanitize('textarea').xss(); // No longer supported
  req.sanitize('foo').toBoolean();

});

Dépréciation de la fonction XSS

La fonction XSS n'est plus disponible dans cette bibliothèque.

https://github.com/chriso/validator.js#deprecations

19 votes

Ils ont retiré le support xss il y a un mois.

5voto

jeandenis Points 31

Vous pouvez également consulter ESAPI . Il existe un version javascript de la bibliothèque . C'est assez solide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X