web-dev-qa-db-fra.com

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

Avez-vous une idée de la façon de prévenir les attaques XSS sur une application node.js? Toutes les bibliothèques qui gèrent la suppression de javascript dans les hrefs, les attributs onclick, etc. à partir de données postées?

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

Aucune suggestion?

62
Techwraith

L’une des réponses à Sanitize/Rewrite HTML côté client suggère d’emprunter le désinfectant HTML basé sur une liste blanche dans JS de Google Caja, qui implémente un analyseur syntaxique HTML SAX. sans compter sur le DOM du navigateur.

Mise à jour: N'oubliez pas non plus que l'assainisseur Caja a apparemment été soumis à un examen complet et professionnel de la sécurité, tandis que les expressions rationnelles sont réputées pour leur facilité à taper des fautes de sécurité pour des raisons de sécurité.

Mise à jour du 24/09/2017: Il existe également maintenant DOMPurify . Je ne l'ai pas encore utilisé, mais on dirait qu'il respecte ou dépasse tous les points que je recherche:

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

    • S'appuie sur le DOM du navigateur ou sur jsdom pour Node.JS.
  • Configuration par défaut conçue pour éliminer le moins possible tout en garantissant la suppression de javascript.

    • Prend en charge HTML, MathML et SVG
    • Retombe à la propriété toStaticHTML de Microsoft, non configurable, sous IE8 et IE9.
  • Hautement configurable, le rendant apte à appliquer des limitations sur une entrée pouvant contenir du code HTML arbitraire, telle qu'un champ de commentaire WYSIWYG ou Markdown. (En fait, c'est le sommet de la pile ici)

    • Prend en charge la liste blanche/liste noire habituelle de balises/attributs et la liste blanche de regex d'URL
    • A des options spéciales à nettoyer pour certains types communs de métacaractères de modèle HTML.
  • Ils sont sérieux au sujet de la compatibilité et de la fiabilité

    • Tests automatisés exécutés sur 16 navigateurs différents ainsi que sur trois versions principales différentes de Node.JS.
    • Pour s'assurer que les développeurs et les hôtes CI sont tous sur la même page, les fichiers de verrouillage sont publiés.
22
ssokolow

J'ai créé un module qui regroupe l'assainisseur HTML Caja

npm install sanitizer

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

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

Tout commentaire apprécié.

54
theSmaw

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

  • Les listes noires ne fonctionneront pas.
  • Vous n'êtes pas censé filtrer les entrées afin de protéger les sorties HTML. Cela ne fonctionnera pas ou fonctionnera en malformant inutilement les données.
  • Vous êtes censé échapper du texte HTML dans la sortie HTML.

Je ne sais pas si node.js est livré avec un logiciel intégré 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;');
}
16
Kornel

J'ai récemment découvert node-validator by chriso .

Exemple

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

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

});

Obsolète de la fonction XSS

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

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

15
Baggz

Vous pouvez aussi regarder ESAPI . Il existe une version de la bibliothèque javascript . C'est assez robuste.

5
jeandenis

Dans les versions plus récentes du module validator, vous pouvez utiliser le script suivant pour empêcher une attaque XSS:

  var validator = require('validator');

  var escaped_string = validator.escape(someString);
3
Paramore

Essayez le module npm strip-js. Il effectue les actions suivantes:

  • Assainit le HTML
  • Supprime les balises de script
  • Supprime les attributs tels que "onclick", "onerror", etc. qui contiennent du code JavaScript
  • Supprime les attributs "href" contenant le code JavaScript

https://www.npmjs.com/package/strip-js

1
Shivanshu Goyal

Vous devriez essayer la bibliothèque npm "insane" . https://github.com/bevacqua/insane

J'essaye en production, ça marche bien. La taille est très petite (environ ~ 3kb gzipped).

  • Désinfecter le html
  • Supprimer tous les attributs ou balises qui évaluent js 
  • Vous pouvez autoriser des attributs ou des balises que vous ne voulez pas assainir

La documentation est très facile à lire et à comprendre . https://github.com/bevacqua/insane

0
Renan Bronchart