web-dev-qa-db-fra.com

Comment désinfecter le code HTML en Java pour prévenir les attaques XSS?

Je cherche class/util, etc. pour supprimer le code HTML, c'est-à-dire supprimer les balises, attributs et valeurs dangereux afin d'éviter les attaques XSS et similaires.

Je reçois du code HTML auprès de l'éditeur de texte enrichi (par exemple, TinyMCE), mais il peut être envoyé de manière malveillante, en omettant la validation de TinyMCE ("Données envoyées hors site").

Y at-il quelque chose d'aussi simple à utiliser que InputFilter en PHP? La solution parfaite que je peux imaginer fonctionne de la sorte (en supposant que le désinfectant soit encapsulé dans la classe HtmlSanitizer):

String unsanitized = "...<...>...";           // some potentially 
                                              // dangerous html here on input

HtmlSanitizer sat = new HtmlSanitizer();      // sanitizer util class created

String sanitized = sat.sanitize(unsanitized); // voila - sanitized is safe...

Mise à jour - la solution la plus simple, mieux c'est! Une petite classe utilitaire avec le moins de dépendances externes possible sur d'autres bibliothèques/frameworks serait préférable pour moi.


Comment sur cela?

22
WildWezyr

Vous pouvez essayer OWASP Java HTML Sanitizer . C'est très simple à utiliser. 

PolicyFactory policy = new HtmlPolicyBuilder()
    .allowElements("a")
    .allowUrlProtocols("https")
    .allowAttributes("href").onElements("a")
    .requireRelNofollowOnLinks()
    .build();

String safeHTML = policy.sanitize(untrustedHTML);
17
Saljack

Vous pouvez utiliser OWASP ESAPI pour Java , qui est une bibliothèque de sécurité conçue pour effectuer de telles opérations.

Non seulement il a des encodeurs pour HTML, il a aussi des encodeurs pour effectuer le codage JavaScript, CSS et URL. _ { Exemples d'utilisations de ESAPI } _ peuvent être trouvés dans la feuille de triche sur la prévention XSS publiée par OWASP. </ Strike>

Vous pouvez utiliser le projet OWASP AntiSamy pour définir une stratégie de site indiquant ce qui est autorisé dans le contenu soumis par l'utilisateur. La stratégie de site peut être utilisée ultérieurement pour obtenir du HTML "propre" qui est affiché. Vous pouvez trouver un échantillon fichier de stratégie TinyMCE sur la page de téléchargement AntiSamy .

12
Vineet Reynolds

Les entrées d'échappement HTML fonctionnent très bien. Mais dans certains cas, les règles commerciales peuvent vous obliger à NE PAS échapper au HTML. L'utilisation de REGEX n'est pas adaptée à la tâche et il est trop difficile de trouver une bonne solution pour l'utiliser.

La meilleure solution que j'ai trouvée consistait à utiliser: http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer

Il construit une arborescence DOM avec l'entrée fournie et filtre tout élément non autorisé auparavant par une liste blanche. L'API a également d'autres fonctions pour nettoyer le code HTML.

Et il peut également être utilisé avec javax.validation @SafeHtml (whitelistType =, additionalTags =)

6
eduardohl

Merci à/Saljack répondre . Juste pour élaborer davantage sur OWASP Java HTML Sanitizer . Cela a très bien fonctionné (rapide) pour moi. Je viens d'ajouter ce qui suit au fichier pom.xml de mon projet Maven:

    <dependency>
        <groupId>com.googlecode.owasp-Java-html-sanitizer</groupId>
        <artifactId>owasp-Java-html-sanitizer</artifactId>
        <version>20150501.1</version>
    </dependency>

Vérifiez ici pour la dernière version.

Ensuite, j'ai ajouté cette fonction pour la désinfection:

    private String sanitizeHTML(String untrustedHTML){
        PolicyFactory policy = new HtmlPolicyBuilder()
            .allowAttributes("src").onElements("img")
            .allowAttributes("href").onElements("a")
            .allowStandardUrlProtocols()
            .allowElements(
            "a", "img"
            ).toFactory();

        return policy.sanitize(untrustedHTML); 
    }

Vous pouvez ajouter davantage de balises en étendant le paramètre délimité par des virgules dans la méthode allowElements.

Ajoutez simplement cette ligne avant de passer le haricot pour sauvegarder les données:

    bean.setHtml(sanitizeHTML(bean.getHtml()));

C'est tout! 

Pour une logique plus complexe, cette bibliothèque est très flexible et peut gérer une implémentation d'assainissement plus sophistiquée.

4
P. Lee

En ce qui concerne Antisamy, vous pouvez vérifier ceci en ce qui concerne les dépendances:

http://code.google.com/p/owaspantisamy/issues/detail?id=95&can=1&q=redyetidave

0
RedYeti