Вот хороший и простой фильтр антисайтовых сценариев (XSS), написанный для веб-приложений Java. По сути, он удаляет все подозрительные строки из параметров запроса, прежде чем вернуть их в приложение. Это улучшение по сравнению с моим предыдущим постом на эту тему .
Вы должны настроить его как первый фильтр в вашей цепочке (web.xml), и, как правило, хорошая идея, чтобы он отлавливал каждый запрос на ваш сайт.
Реальная реализация состоит из двух классов, реальный фильтр довольно прост, он оборачивает объект HTTP-запроса в специализированный HttpServletRequestWrapper, который будет выполнять нашу фильтрацию.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public class XSSFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter( new XSSRequestWrapper((HttpServletRequest) request), response); } } |
Оболочка переопределяет методы getParameterValues (), getParameter () и getHeader () для выполнения фильтрации перед возвратом нужного поля вызывающей стороне. Фактическая проверка и чередование XSS выполняется в приватном методе stripXSS ().
01
02
03
04
05
06
07
08
09
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
|
import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class XSSRequestWrapper extends HttpServletRequestWrapper { public XSSRequestWrapper(HttpServletRequest servletRequest) { super (servletRequest); } @Override public String[] getParameterValues(String parameter) { String[] values = super .getParameterValues(parameter); if (values == null ) { return null ; } int count = values.length; String[] encodedValues = new String[count]; for ( int i = 0 ; i < count; i++) { encodedValues[i] = stripXSS(values[i]); } return encodedValues; } @Override public String getParameter(String parameter) { String value = super .getParameter(parameter); return stripXSS(value); } @Override public String getHeader(String name) { String value = super .getHeader(name); return stripXSS(value); } private String stripXSS(String value) { if (value != null ) { // NOTE: It's highly recommended to use the ESAPI library and uncomment the following line to // avoid encoded attacks. // value = ESAPI.encoder().canonicalize(value); // Avoid null characters value = value.replaceAll( "" , "" ); // Avoid anything between script tags Pattern scriptPattern = Pattern.compile( "<script>(.*?)</script>" , Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll( "" ); // Avoid anything in a src='...' type of expression scriptPattern = Pattern.compile( "src[\r\n]*=[\r\n]*\\\'(.*?)\\\'" , Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll( "" ); scriptPattern = Pattern.compile( "src[\r\n]*=[\r\n]*\\\"(.*?)\\\"" , Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll( "" ); // Remove any lonesome </script> tag scriptPattern = Pattern.compile( "</script>" , Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll( "" ); // Remove any lonesome <script ...> tag scriptPattern = Pattern.compile( "<script(.*?)>" , Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll( "" ); // Avoid eval(...) expressions scriptPattern = Pattern.compile( "eval\\((.*?)\\)" , Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll( "" ); // Avoid expression(...) expressions scriptPattern = Pattern.compile( "expression\\((.*?)\\)" , Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll( "" ); // Avoid javascript:... expressions scriptPattern = Pattern.compile( "javascript:" , Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll( "" ); // Avoid vbscript:... expressions scriptPattern = Pattern.compile( "vbscript:" , Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll( "" ); // Avoid onload= expressions scriptPattern = Pattern.compile( "onload(.*?)=" , Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll( "" ); } return value; } } |
Обратите внимание на комментарий о библиотеке ESAPI , я настоятельно рекомендую вам проверить его и попытаться включить в свои проекты.
Если вы хотите углубиться в тему, я предлагаю вам заглянуть на страницу OWASP о XSS и шпаргалке RSnake XSS (межсайтовый скриптинг) .
Ссылка: более сильный фильтр антисайтовых сценариев (XSS) для веб-приложений Java от нашего партнера по JCG