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

je cherche classe/util etc. pour assainir le code HTML, c'est-à-dire supprimer les étiquettes dangereuses, les attributs et les valeurs pour éviter les attaques XSS et similaires.

je reçois du code html de l'éditeur de texte riche (par exemple TinyMCE), mais il peut être envoyé de manière malveillante, commiting TinyMCE validation ("données soumises formulaire hors site").

y a-t-il quelque chose d'aussi simple à utiliser que InputFilter en PHP? La solution parfaite que je peux imaginer fonctionne comme cela (supposons que le désinfectant est encapsulé dans le désinfectant HtmlSanitizer classe):

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, le mieux! Petite classe util avec aussi peu de dépendances externes sur d'autres bibliothèques/cadres que possible - serait mieux pour moi.


Qu'en dites-vous?

21
demandé sur WildWezyr 2010-08-05 13:17:10

5 réponses

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

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

String safeHTML = policy.sanitize(untrustedHTML);
15
répondu Saljack 2015-08-04 10:25:49

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

non seulement il a des encodeurs pour HTML, mais il a aussi des encodeurs pour effectuer le codage JavaScript, CSS et URL. exemples d'utilisation de L'ESAPI peut être trouvé dans le cheatsheet XSS prevention publié par OWASP.

vous pourriez utiliser le OWASP AntiSamy projet pour définir une politique de site qui indique ce qui est autorisé dans le contenu soumis par l'utilisateur. La politique du site peut être utilisée plus tard pour obtenir du HTML "propre" qui est affiché en arrière. Vous pouvez trouver un exempleTinyMCE politique de fichier sur le AntiSamy page de téléchargement.

12
répondu Vineet Reynolds 2010-08-05 10:26:31

HTML échapper les entrées fonctionne très bien. Mais dans certains cas, les règles d'affaires peuvent exiger que vous n'échappiez pas au HTML. Utiliser REGEX N'est pas adapté à la tâche et il est trop difficile de trouver une bonne solution pour l'utiliser.

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

il construit un arbre DOM avec l'entrée fournie et filtre tout élément non précédemment autorisé par une liste blanche. L'API a également d'autres les fonctions de nettoyage html.

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

6
répondu eduardohl 2013-08-01 16:01:04

merci à @ Saljack's réponse. Juste pour développer plus à OWASP Java HTML Sanitizer. Ça s'est très bien passé (rapidement) pour moi. Je viens d'ajouter ce qui suit au pom.xml dans mon projet Maven:

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

Case ici pour la dernière version.

puis 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); 
    }

il est possible d'ajouter D'autres balises en étendant le paramètre délimité par une virgule dans les allegelements méthode.

il suffit d'ajouter cette ligne avant de passer la fève pour enregistrer les données:

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

C'est ça!

pour une logique plus complexe, cette bibliothèque est très flexible et elle peut gérer une implémentation de désinfection plus sophistiquée.

4
répondu P. Lee 2017-05-23 12:34:43

en ce qui concerne L'Antisamie, 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
répondu RedYeti 2011-02-23 15:12:03