Comment effectuer l'encodage de sortie à l'aide de filtre pour empêcher les attaques de type XSS?
Je suis en utilisant le code suivant dans le servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
response.setContentType("text/html");
out.println("<html>");
out.println("<body>");
out.println("<script>alert(1)</script>");
out.println("</body>");
out.println("</html>");
}
Et suivant du code pour le filtre:
public class SampleFilter implements Filter {
protected FilterConfig config;
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws ServletException, IOException {
long startTime = System.currentTimeMillis();
ServletResponse newResponse = response;
if (request instanceof HttpServletRequest) {
System.out.println("in filter if1");
newResponse = new CharResponseWrapper((HttpServletResponse) response);
}
System.out.println("after filter if1");
chain.doFilter(request, newResponse);
long elapsed = System.currentTimeMillis() - startTime;
if (newResponse instanceof CharResponseWrapper) {
System.out.println("in filter if2");
String text = newResponse.toString();
if (text != null) {
text = SampleFilter.HTMLEntityEncode(text);//.toUpperCase();
response.getWriter().write(text);
}
}
System.out.println("after filter if2");
config.getServletContext().log(" took " + elapsed + " ms");
System.out.println(elapsed);
}
private static String HTMLEntityEncode(String input) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
if (Character.isLetterOrDigit(ch) || Character.isWhitespace(ch)) {
sb.append(ch);
} else {
sb.append("&#" + (int)ch + ";");
}
}
return sb.toString();
}
}
Je veux obtenir l'affichage suivant des données dans le navigateur:
<script>alert(1)</script>
plutôt que je suis
<html>
<body>
<script>alert(1)</script>
</body>
</html>
dans le navigateur.
Toute aide sera grande.
OriginalL'auteur | 2013-03-29
Vous devez vous connecter pour publier un commentaire.
Ne pas le faire à la dure. Utilisez simplement JSP pour la génération de la sortie HTML. La JSP standard tag library (JSTL) offre builtin façons de s'échapper contrôlée par l'utilisateur des données à partir d'attaque XSS trous dans la saveur de
<c:out>
tag et${fn:escapeXml()}
fonction..Ils vont échapper à predefinied entités XML comme
<
par>
de sorte qu'il devient totalement inoffensif.Les Servlets ne sont pas conçus pour générer du HTML à la sortie. Ils sont conçus dans le but de contrôler la demande/réponse.
Voir aussi:
OriginalL'auteur BalusC
En essayant d'empêcher les attaques XSS vous devez séparer le code est valide à partir de potentiel dangereux des pièces à partir des expressions valides. Il existe différentes techniques pour y parvenir:
S'échapper de données lié: Dans ce cas, vous devez utiliser une sorte de templating de la technologie. Anyting définis dans le temeplate est considéré comme sûr. Dans le cas le plus simple de toutes les données liées considéré comme dangereux et donc échappé. Une solution de cette simple est Snippetory. (Oui, j'ai développer. Vous pouvez l'obtenir à partir d' Sourceforge ou repo maven) Le modèle peut ressembler à ceci:
Puis le code de liaison pourrait ressembler à ceci:
Cependant, la disadvatage est que l'ensemble de la sortie du traitement doit être fait de la rigtht. Mais je pense que pour projets sérieux c'est le moyen le plus important.
Maintenant quelques approches qui pourraient être utilisées après le traitement, cependant, sont généralement utilisés en combinaison avec d'échappement de données lié à mettre en œuvre des choses complexes comme l'éditeur de champ ici sur Stackoverflow:
Liste blanche: Essentiellement, vous analyser les données (peut-être l'aide d'un analyseur html) et d'échapper à tout ce qui n'est pas partie d'une balise que vous mettez sur votre liste blanche. Et supprimer tous les attributs que vous ne laissez pas. C'est assez sûr, mais très restrictif, trop. En outre, il est assez complexe, donc je ne peux pas fournir un exemple ici.
La Liste noire: à peu près la même, il suffit de vous laisser passer ce qui n'est pas sur votre vlack liste. Si vous avez oublié quelque chose de dangereux attaques sont encore possibles.
OriginalL'auteur Sir RotN
dans votre cas, à l'aide de remplissage est impossible, car là, pas moyen de séparer le contenu légitime de tout contenu qui a été injecté. heuristique de la boîte noire de la défense contre les attaques de type xss pourrait être appliquée par filtrage d'entrée plutôt que de sortie.
l'encodage? oui. la boîte noire de la sécurité? pas de.
Mais comme il n'y a aucun moyen de séparer le contenu légitime de tout contenu qui a été injecté,alors comment serait le codage portera son fruit.
Je n'ai rien dit au sujet de toute fruits. Je n'ai aucune idée de quels sont les fruits que vous avez besoin. Il n'y a rien qui vous empêche de codage de la sortie en aucune façon que vous voulez (base64, rot13, utf16, changement de tous les 'a' dans '@', n'importe quoi), mais, comme je l'ai dit, vous ne bénéficierez pas de la protection XSS de cette façon.
OriginalL'auteur fdreger
J'ai mis en place un Filtre XSS pour un Maillot API REST. Le code peut facilement être extraites et appliqué à un standard de Java Filtre.
La plupart des gens recommandent codant pour la sortie, mais comme nos données peuvent être accessibles via une API JavaScript et il n'existe aucun moyen de garantir à nos clients de filtrer les vulnérabilités XSS, nous avons opté pour le filtrage des failles XSS sur entrée. Un autre avantage de cette approche est que le filtrage se fait une seule fois et non à chaque fois que des données sont de sortie.
Noter que le filtre doit être utilisé en conjonction avec la JSR 303 @SafeHtml annotation pour s'assurer que le contenu du POST de données sont correctement filtrée.
J'ai documenté sur mon blog ici: http://codehustler.org/blog/jersey-cross-site-scripting-xss-filter-for-java-web-apps/
OriginalL'auteur Alessandro Giannone