Accès rapide :
La vidéo
Le code de la vidéo
Un développeur Web a de lourdes responsabilités. Mal développée une application Web peut permettre de nombreux types d'attaques et notamment les attaques XSS (Cross Site Scripting). Cette vidéo vous montre le fonctionnement d'une attaque XSS sur un site peu sécurisé et, surtout, elle vous montre comment contrer ce type d'attaque via un filtre de servlet.
Le code suivant permet de définir une classe permettant d'expurger des paramètres soumis à une page web (servlet et/ou JSP). Pour ce faire, les
méthodes de récupération de données (getParameterValues
, getParameters
et getHeader
) sont redéfinies afin
de repérer et de supprimer toutes tentatives d'injection de code Javascript ou de caractères encodés.
/*
afin d'être certains de déclencher pour toutes les requêtes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
package fr.koor.webstore.ihm; import java.io.IOException; import java.util.regex.Pattern; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; @WebFilter(filterName = "XssFilter", urlPatterns = {"/*"} ) public class XssFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter( new XssRequestWrapper( (HttpServletRequest) request), response ); } @Override public void destroy() { } private static class XssRequestWrapper extends HttpServletRequestWrapper { private static final Pattern [] XSS_PATTERNS = { Pattern.compile( "<.*?>" ), Pattern.compile( "&.*?;" ), Pattern.compile( "%[0-9a-fA-F]*" ) }; public XssRequestWrapper(HttpServletRequest servletRequest) { super(servletRequest); } @Override public String[] getParameterValues( String parameterName ) { String [] values = super.getParameterValues(parameterName); if (values == null) return null; int count = values.length; for ( int i = 0; i < count; i++ ) { // On remplace chaque chaîne de caractères values[i] = removeTags(values[i]); } return values; } @Override public String getParameter( String parameter ) { return removeTags( super.getParameter(parameter) ); } @Override public String getHeader( String name ) { return removeTags( super.getHeader(name) ); } private String removeTags( String value ) { if ( value != null ) { // On retire le code ASCII 0, au cas ou value = value.replaceAll( "\0", "" ); // Supprime l'ensemble de tags et des entités existants for ( Pattern pattern : XSS_PATTERNS ) { value = pattern.matcher( value ).replaceAll( "" ); } // Au cas ou les caractères < et > ne seraient pas en nombres pairs value = value.replaceAll( "<", "" ); value = value.replaceAll( ">", "" ); } return value; } } } |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :