当前位置:   article > 正文

存储型XSS攻击的简单处理以及数据库查询过滤多个字段重复数据_过滤储存型xss

过滤储存型xss

 问题:储存型Xss是由于form表单提交的数据,前端和后台未进行过滤,将一些javascript的脚步语言存入数据库中。导致再次查询数据的时候浏览器会执行该脚步语言。如:<script>alert("XSS")</script>。

解决方案:主要是后台的过滤,部分可绕过前端直接输入。

解决思路:采用过滤器过滤用户的输入,将一些敏感的信息直接replaceAll即可。过滤器过滤的数据通过过滤器链对请求的数据进行过滤。重写了getParameter("");方法。

①:定义一过滤器

  1. public class XSSFilter implements Filter {
  2. private static final Logger log = LoggerFactory.getLogger(Filter.class);
  3. @Override
  4. public void init(FilterConfig arg0) throws ServletException {
  5. }
  6. @Override
  7. public void destroy() {
  8. }
  9. @Override
  10. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  11. throws IOException, ServletException {
  12. log.info("XSS过滤器开始过滤:{}", request.getRemoteAddr());
  13. chain.doFilter(new XssRequestWrappers((HttpServletRequest) request), response);
  14. }

②:写一个类继承处理请求的servlet   HttpServletRequestWrapper 重写该类的几个方法。

  1. public class XssRequestWrappers extends HttpServletRequestWrapper {
  2. private CommonsMultipartResolver multiparResolver = new CommonsMultipartResolver();
  3. public XssRequestWrappers(HttpServletRequest request) {
  4. super(request);
  5. String type = request.getHeader("Content-Type");
  6. if (!StringUtils.isEmpty(type) && type.contains("multipart/form-data")) {
  7. MultipartHttpServletRequest multipartHttpServletRequest = multiparResolver.resolveMultipart(request);
  8. Map<String, String[]> stringMap = multipartHttpServletRequest.getParameterMap();
  9. if (!stringMap.isEmpty()) {
  10. for (String key : stringMap.keySet()) {
  11. String value = multipartHttpServletRequest.getParameter(key);
  12. XSSUtil.stripXSS(key);
  13. XSSUtil.stripXSS(value);
  14. }
  15. }
  16. super.setRequest(multipartHttpServletRequest);
  17. }
  18. }
  19. @Override
  20. public String[] getParameterValues(String parameter) {
  21. String[] values = super.getParameterValues(parameter);
  22. if (values == null) {
  23. return null;
  24. }
  25. int count = values.length;
  26. String[] encodedValues = new String[count];
  27. for (int i = 0; i < count; i++) {
  28. encodedValues[i] = XSSUtil.stripXSS(values[i]);
  29. }
  30. return encodedValues;
  31. }
  32. @Override
  33. public String getParameter(String parameter) {
  34. String value = super.getParameter(parameter);
  35. return XSSUtil.stripXSS(value);
  36. }
  37. @Override
  38. public String getHeader(String name) {
  39. String value = super.getHeader(name);
  40. return XSSUtil.stripXSS(value);
  41. }
  42. @Override
  43. @SuppressWarnings("unchecked")
  44. public Map getParameterMap() {
  45. HashMap<String, String[]> paramMap = (HashMap<String, String[]>) super.getParameterMap();
  46. paramMap = (HashMap<String, String[]>) paramMap.clone();
  47. for (Iterator iterator = paramMap.entrySet().iterator(); iterator.hasNext(); ) {
  48. Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) iterator.next();
  49. String[] values = entry.getValue();
  50. for (int i = 0; i < values.length; i++) {
  51. if (values[i] instanceof String) {
  52. values[i] = XSSUtil.stripXSS(values[i]);
  53. }
  54. }
  55. entry.setValue(values);
  56. }
  57. return paramMap;
  58. }

特别提醒:过滤数据的时候,有些数据是过滤不到的,是因为请求头(Content-Type)的原因。有的是multipart/form-data类型的,你要获取该类型并且进行转换才可以获得对应的参数,进而进行过滤修改,第二步已经中的第一个方法就是处理该请求头的方法。步骤可以看代码所示。另外一种请求头是application/x-www-form-urlencoded。这种的可以直接过滤掉,不需要采取request的转换,其他的几个请求头博主暂时没试过。



③:写一过滤敏感信息的工具类,可以根据实际情况进行过滤。网上很多例子。

  1. public class XSSUtil {
  2. public static String stripXSS(String value) {
  3. if (value != null) {
  4. value = value.replaceAll("", "");
  5. // Avoid anything between script tags
  6. Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
  7. value = scriptPattern.matcher(value).replaceAll("");
  8. // Avoid anything in a src="..." type of e­xpression
  9. scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  10. value = scriptPattern.matcher(value).replaceAll("");
  11. scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  12. value = scriptPattern.matcher(value).replaceAll("");
  13. // Remove any lonesome </script> tag
  14. scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
  15. value = scriptPattern.matcher(value).replaceAll("");
  16. // Remove any lonesome <script ...> tag
  17. scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  18. value = scriptPattern.matcher(value).replaceAll("");
  19. // Avoid eval(...) e­xpressions
  20. scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  21. value = scriptPattern.matcher(value).replaceAll("");
  22. // Avoid e­xpression(...) e­xpressions
  23. scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  24. value = scriptPattern.matcher(value).replaceAll("");
  25. // Avoid javascript:... e­xpressions
  26. scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
  27. value = scriptPattern.matcher(value).replaceAll("");
  28. // Avoid vbscript:... e­xpressions
  29. scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
  30. value = scriptPattern.matcher(value).replaceAll("");
  31. // Avoid onload= e­xpressions
  32. scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  33. value = scriptPattern.matcher(value).replaceAll("");
  34. }
  35. return value;
  36. }
  37. }


④:在web.xml中配置过滤器

  1. <filter>
  2. <filter-name>xssFilter</filter-name>
  3. <filter-class>com.wisemax.hnrb.interceptors.XSSFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>xssFilter</filter-name>
  7. <url-pattern>*.do</url-pattern>
  8. </filter-mapping>

完成上面四个步骤的时候,就可以正常启动项目,进行XSS的测试了。博主亲测无误!

 

问题二:很多时候,数据库中包含的数据存在重复的现象

如上图所示的SQL语句,出现的数据case_no 和case_type是存在重复的。那么我就认为这两个是重复的数据,只能取其中的一个数据。

解决方法:对重复的数据进行分组操作(理论上几个字段重复,就groub by几个字段,实际上会出现性能的问题。)

特别提醒:如果重复数据过多,不建议使用此方法,并且子查询的时候尽量使用索引,博主这个会全表扫描,数据多会出现查询慢的情况。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号