Rechercher
 

Apprendre a contrer les attaques XSS (Cross Site Scripting) avec un filtre de servlet

JDBC et les attaques par injection SQL Création d'une librairie de Tags (TagLib)



Accès rapide :
La vidéo
Le code de la vidéo

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.


Apprendre à contrer les attaques XSS (Cross Site Scripting) avec un filtre de servlet

Le code de la vidéo

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.

Le filtre est associé à l'URL /* 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;
        }
    }

}
Un filtre de servlet bloquant les attaques XSS connues


JDBC et les attaques par injection SQL Création d'une librairie de Tags (TagLib)