2009-02-15 4 views
3

Je dois implémenter un filtre XSS simple et efficace en C++ pour CppCMS. Je ne peux pas utiliser les filtres de haute qualité existants écrits en PHP parce que c'est un framework de haute performance qui utilise C++.Écriture du filtre XSS pour (X) HTML basé sur la liste blanche

L'idée de base est de fournir un filtre contenant une liste de balises HTML et une liste d'options blanche pour ces balises. Par exemple. entrée HTML typique peut se composer de <b>, <i>, les étiquettes et <a> tag avec href. Mais la mise en œuvre simple n'est pas assez bon, parce que, même permis des liens simples peuvent inclure XSS:

<a href="javascript:alert('XSS')">Click On Me</a> 

Il y a beaucoup d'autres exemples peuvent être trouvés there. Donc, je pensais aussi à la possibilité de créer une liste blanche des préfixes pour les balises comme href/src - donc je dois toujours vérifier si elle commence par (https?|ftp)://

Questions:

  • ces hypothèses sont sont assez bon pour la plupart des objectifs? Ce qui signifie que si je ne donne pas des options pour les étiquettes style et vérifie src/href en utilisant la liste blanche des préfixes, il résout les problèmes XSS? Y a-t-il des problèmes qui ne peuvent pas être résolus de cette façon?
  • est-il une bonne référence pour la grammaire formelle de HTML/XHTML pour écrire analyseur simple qui serait le nettoyage tout incorrect des balises interdites comme <script>

Répondre

4

Vous pouvez jeter un oeil sur le projet Anti Samy, en essayant accomplir la même chose. C'est Java et .NET cependant.

Edit 1, un peu plus:

Vous pouvez éventuellement venir avec une liste blanche très stricte. Il devrait être bien structuré et devrait être assez serré et pas très flexible. Lorsque vous combinez la flexibilité, tant de balises, d'attributs et de navigateurs différents, vous vous retrouvez avec une vulnérabilité XSS. Je ne sais pas quelles sont vos exigences, mais j'irais avec un support de balise strict et simple (seulement b li h1 etc.), puis un support d'attribut strict basé sur la balise (par exemple src est seulement valide sous balise href), alors vous devez faire une liste blanche dans les valeurs d'attribut que vous avez déclaré http | https | ftp ou style = "color | couleur d'arrière-plan", etc.

Tenir compte celui-ci:

<x style="express/**/ion:(alert(/bah!/))">

Vous devez également penser à une liste blanche de caractères ou à une normalisation UTF-8, car des codages différents peuvent provoquer ssues. Tels que de nouvelles lignes dans les attributs, des séquences UTF-8 non valides.

1

Tous les détails de l'analyse HTML sont specified in HTML 5.Cependant, la mise en œuvre de ce travail demande beaucoup de travail et peu importe que vous analysiez HTML avec précision dans tous les cas. Au pire, vous allez vous retrouver avec des DOM différents, mais vous devez tout de même désinfecter le DOM.

1

Comme vous l'avez mentionné, il existe différentes implémentations PHP, mais je n'en connais aucune en C++, car ce n'est pas un langage typiquement appliqué au développement web. Dans l'ensemble, cela dépendra de la complexité de la mise en œuvre que vous souhaitez obtenir. Une liste blanche très restrictive est probablement la plus "simple", mais si vous voulez être très complet, je voudrais faire une conversion de l'une des versions établies en C++, plutôt que d'essayer d'écrire la vôtre à partir de zéro. . Il y a tellement de trucs à s'inquiéter, que je pense que vous feriez mieux de rester debout sur les épaules des autres qui ont déjà traversé tout ça. Je ne sais rien sur l'utilisation de C++ pour le développement web, mais la conversion de PHP ne semble pas être une tâche particulièrement difficile, PHP n'a pas vraiment de capacités magiques que C++ ne sera pas capable de dupliquer. Je suis sûr qu'il y aura quelques petits problèmes, mais dans l'ensemble si vous voulez aller sur la route plus complexe, il serait certainement encore plus rapide de faire une conversion que d'un design complet à partir de zéro.

HTML Purifier semble comme une forte implémentation PHP qui est toujours maintenu activement, il y a a comparison document où l'auteur discute des différences entre son approche et celle des autres, sans doute la peine de lire. Quoi que vous trouviez, essayez-le définitivement avec tous les exemples que vous liez, et assurez-vous qu'il passe tout cela. Bonne chance!

Questions connexes