81 votes

Prévention XSS en Java

Comment puis-je prévenir les attaques XSS en Java? Existe-t-il de bonnes bibliothèques pour cela?

119voto

BalusC Points 498232

Depuis XSS est généralement un sujet de préoccupation dans les applications je parie que vous parlez JSP/Servlet. XSS peut être évité en JSP en utilisant JSTL <c:out> balise ou fn:escapeXml() EL de la fonction lors de la (re)affichage de l'utilisateur entrée contrôlée. Cela inclut les en-têtes de requête, les cookies, URL, le corps, les paramètres, etc, l'ensemble de la demande. Aussi l'utilisateur à l'entrée contrôlée qui est stockée dans une base de données doit être échappés lors de l'affichage.

Par exemple:

<p><c:out value="${bean.userControlledValue}"></p>
<p><input name="foo" value="${fn:escapeXml(param.foo)}"></p>

Cela permettra d'échapper les caractères qui peuvent malform le rendu HTML comme <, >, ", ' et & en HTML/XML entités telles que l' &lt;, &gt;, &quot;, &apos; et &amp;.

Notez que vous n'avez pas besoin d'échapper à la Java (Servlet) du code, puisqu'ils sont inoffensifs, là-bas. Certains peuvent opter pour leur échapper lors de la demande de traitement (comme vous le faites dans le Servlet) au lieu de la réponse de traitement (comme vous le faites dans JSP), mais de cette façon, vous pouvez risque que les données inutilement obtenir le double-échappé ou que le DB-données stockées devient portables (par exemple, lors de l'exportation des données au format CSV, XLS, PDF, etc qui ne nécessite pas de HTML échapper à tous).

Le seul souci dans le côté serveur à l'égard des bases de données est SQL injection de prévention. Vous devez vous assurer que vous n'avez jamais à la chaîne concaténer contrôlée par l'utilisateur d'entrée directement dans la requête SQL et que vous êtes en utilisant des requêtes paramétrées dans tous les sens. Tout bon libraire ORM (Hibernate et ainsi de suite) ont déjà pris en compte. Si vous travaillez avec des "brutes" JDBC, vous devez vous assurer que vous définissez contrôlée par l'utilisateur d'entrée à l'aide de PreparedStatement au lieu de Statement.

12voto

Sripathi Krishnan Points 15402

Le comment-pour-éviter-xss a été posée à plusieurs reprises. Vous trouverez une foule d'informations sur StackOverflow. Aussi, OWASP site web dispose d'un XSS prévention de la feuille de triche que vous devez passer par.

Sur les bibliothèques à utiliser, OWASP de l'ESAPI bibliothèque a un java saveur. Vous devriez essayer ça. En outre, chaque framework que vous utilisez a une certaine protection contre les attaques de type XSS. Encore une fois, OWASP site présente de l'information sur les cadres les plus populaires, donc je vous conseille de passer par leur site.

12voto

Adam Gent Points 15055

J'ai eu beaucoup de chance avec OWASP Anti-Samy et un conseiller AspectJ sur tous mes contrôleurs Spring qui empêchent XSS d'entrer.

 public class UserInputSanitizer {

    private static Policy policy;
    private static AntiSamy antiSamy;

    private static AntiSamy getAntiSamy() throws PolicyException  {
        if (antiSamy == null) {
            policy = getPolicy("evocatus-default");
            antiSamy = new AntiSamy();
        }
        return antiSamy;

    }

    public static String sanitize(String input) {
        CleanResults cr;
        try {
            cr = getAntiSamy().scan(input, policy);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return cr.getCleanHTML();
    }

    private static Policy getPolicy(String name) throws PolicyException {
        Policy policy = 
            Policy.getInstance(Policy.class.getResourceAsStream("/META-INF/antisamy/" + name + ".xml"));
        return policy;
    }

}
 

Vous pouvez obtenir le conseiller AspectJ à partir du message this stackoverflow

Je pense que c est une meilleure approche que c: en particulier si vous utilisez beaucoup de javascript.

8voto

MasterV Points 308

La gestion de XSS exige de multiples validations, les données côté client.

  1. Validations d'entrée (validation de formulaire) sur le côté Serveur. Il existe plusieurs façons d'aller à ce sujet. Vous pouvez essayer de la JSR 303 bean validation(hibernate validator), ou ESAPI Entrée de Validation. Bien que je n'ai pas essayé moi-même (encore), il y a une annotation qui vérifie pour la sécurité de html (@SafeHtml). Vous pouvez en effet utiliser Hibernate validator avec Spring MVC pour bean validations -> Ref
  2. Échapper à des demandes d'URL - Pour toutes vos demandes HTTP, utilisez une sorte de filtre XSS. J'ai utilisé les méthodes suivantes pour notre web app et il prend soin de nettoyer l'URL HTTP request - http://www.servletsuite.com/servlets/xssflt.htm
  3. S'échapper de données/html renvoyé au client (voir plus haut à @BalusC explication).

3voto

Sean Reilly Points 9869

Je suggérerais de tester régulièrement les vulnérabilités à l'aide d'un outil automatisé et de corriger tout ce qu'il trouve. Il est beaucoup plus facile de suggérer une bibliothèque pour aider avec une vulnérabilité spécifique que pour toutes les attaques XSS en général.

Skipfish est un outil open source de Google sur lequel j'ai étudié: il trouve pas mal de choses et semble en valoir la peine.

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