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 package fr.paris.lutece.portal.web.xss;
35
36 import fr.paris.lutece.util.http.SecurityUtil;
37
38 import java.io.IOException;
39
40 import javax.servlet.Filter;
41 import javax.servlet.FilterChain;
42 import javax.servlet.FilterConfig;
43 import javax.servlet.ServletException;
44 import javax.servlet.ServletRequest;
45 import javax.servlet.ServletResponse;
46 import javax.servlet.http.HttpServletRequest;
47 import javax.servlet.http.HttpServletResponse;
48
49
50
51
52 public abstract class SafeRequestFilter implements Filter
53 {
54 private static final String PROPERTY_TITLE_REQUEST_PARAMETERS_CONTAINS_XSS_CHARACTERS = "portal.util.message.titleDefault";
55 private static final String PROPERTY_REQUEST_PARAMETERS_CONTAINS_XSS_CHARACTERS = "portal.util.message.requestParametersContainsXssCharacters";
56 private static final String PARAM_FILTER_XSS_CHARATERS = "xssCharacters";
57 private static final String ACTIVATE_XSS_FILTER = "activateXssFilter";
58 private static final String SANITIZE_FILTER_MODE = "sanitizeFilterMode";
59 private String _strXssCharacters;
60 private boolean _bActivateXssFilter;
61 private boolean _bSanitizeFilterMode;
62
63
64
65
66 public void initFilter( boolean activateXssFilter, boolean sanitizeFilterMode, String strXssCharacters )
67 {
68 _bActivateXssFilter = activateXssFilter;
69 _bSanitizeFilterMode = sanitizeFilterMode;
70 _strXssCharacters = strXssCharacters;
71 }
72
73
74
75
76
77
78 public void initFromFilterConfig( FilterConfig config )
79 {
80 String strParamValue = config.getInitParameter( PARAM_FILTER_XSS_CHARATERS );
81 _strXssCharacters = strParamValue;
82 String strParamActivate = config.getInitParameter( ACTIVATE_XSS_FILTER );
83 String strParamModeSanitize = config.getInitParameter( SANITIZE_FILTER_MODE );
84
85 if ( strParamActivate != null )
86 {
87 _bActivateXssFilter = Boolean.valueOf( strParamActivate );
88 }
89 if ( strParamModeSanitize != null )
90 {
91 _bSanitizeFilterMode = Boolean.valueOf( strParamModeSanitize );
92 }
93 }
94
95
96
97
98 @Override
99 public void destroy( )
100 {
101
102 }
103
104
105
106
107 @Override
108 public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException
109 {
110 HttpServletRequest httpRequest = (HttpServletRequest) request;
111
112 if ( _bActivateXssFilter && _bSanitizeFilterMode && request instanceof HttpServletRequest)
113 {
114 chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
115 }
116 else if ( _bActivateXssFilter && _strXssCharacters != null && !_strXssCharacters.trim( ).equals( "" )
117 && !SecurityUtil.containsCleanParameters( httpRequest, _strXssCharacters ) )
118 {
119 HttpServletResponse httpServletResponse = (HttpServletResponse) response;
120 httpServletResponse.sendRedirect( getMessageUrl( httpRequest, PROPERTY_REQUEST_PARAMETERS_CONTAINS_XSS_CHARACTERS, null,
121 PROPERTY_TITLE_REQUEST_PARAMETERS_CONTAINS_XSS_CHARACTERS ) );
122 }
123 else
124 {
125 chain.doFilter(request, response);
126 }
127 }
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 protected abstract String getMessageUrl( HttpServletRequest request, String strMessageKey, Object [ ] messageArgs, String strTitleKey );
143 }