防止Xss攻击

- 日理万妓 2023-07-05 05:29 105阅读 0赞

原理:通过过滤request请求的paramer进行处理。

1,编写xssFilter类,

  1. public class XssFilter implements Filter {
  2. FilterConfig filterConfig = null;
  3. private List<String> urlExclusion = null;
  4. public void init(FilterConfig filterConfig) throws ServletException {
  5. this.filterConfig = filterConfig;
  6. }
  7. public void destroy() {
  8. this.filterConfig = null;
  9. }
  10. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  11. HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  12. String servletPath = httpServletRequest.getServletPath();
  13. if (urlExclusion != null && urlExclusion.contains(servletPath)) {
  14. chain.doFilter(request, response);
  15. } else {
  16. chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);
  17. }
  18. }
  19. public List<String> getUrlExclusion() {
  20. return urlExclusion;
  21. }
  22. public void setUrlExclusion(List<String> urlExclusion) {
  23. this.urlExclusion = urlExclusion;
  24. }

2,通过XssHttpServletRequestWrapper过滤url

  1. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
  2. public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
  3. super(servletRequest);
  4. }
  5. public String[] getParameterValues(String parameter) {
  6. String[] values = super.getParameterValues(parameter);
  7. if (values == null) {
  8. return null;
  9. }
  10. int count = values.length;
  11. String[] encodedValues = new String[count];
  12. for (int i = 0; i < count; i++) {
  13. encodedValues[i] = cleanXSS(values[i]);
  14. }
  15. return encodedValues;
  16. }
  17. public String getParameter(String parameter) {
  18. String value = super.getParameter(parameter);
  19. if (value == null) {
  20. return null;
  21. }
  22. return cleanXSS(value);
  23. }
  24. public String getHeader(String name) {
  25. String value = super.getHeader(name);
  26. if (value == null)
  27. return null;
  28. return cleanXSS(value);
  29. }
  30. private String cleanXSS(String value) {
  31. //You'll need to remove the spaces from the html entities below
  32. value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
  33. value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
  34. value = value.replaceAll("'", "& #39;");
  35. value = value.replaceAll("eval\\((.*)\\)", "");
  36. value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
  37. value = value.replaceAll("script", "");
  38. return value;
  39. }
  40. }

3,注入spring中

  1. /**
  2. * xssFilter注册
  3. */
  4. @Bean
  5. public FilterRegistrationBean xssFilterRegistration() {
  6. XssFilter xssFilter = new XssFilter();
  7. // 这里可以加不被xss过滤的接口
  8. //xssFilter.setUrlExclusion(Arrays.asList("/merchants/*"));
  9. FilterRegistrationBean registration = new FilterRegistrationBean(xssFilter);
  10. registration.addUrlPatterns("/*"); //这里的/*指拦截所有路径
  11. return registration;
  12. }

注:有参考guns开源框架的实现方案。感谢guns作者。

发表评论

表情:
评论列表 (有 0 条评论,105人围观)

还没有评论,来说两句吧...

相关阅读