防止常见XSS 过滤 SQL注入 JAVA过滤器filter

作者 : 开心源码 本文共5147个字,预计阅读时间需要13分钟 发布时间: 2022-05-11 共63人阅读

XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意html代码,当使用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击使用户的特殊目的。

sql注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利使用现有应使用程序,将(恶意)的SQL命令注入到后端数据库引擎执行的可以力,它能通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者用意去执行SQL语句。

1、首先配置web.xml,增加如下配置信息:

  1. xssAndSqlFilter
  2. com.cup.cms.web.framework.filter.XssAndSqlFilter
  3. xssAndSqlFilter
  4. *
  5. 2、编写过滤器
  6. /**
  7. *
  8. */
  9. package com.cup.cms.web.framework.filter;
  10. import java.io.IOException;
  11. import javax.servlet.Filter;
  12. import javax.servlet.FilterChain;
  13. import javax.servlet.FilterConfig;
  14. import javax.servlet.ServletException;
  15. import javax.servlet.ServletRequest;
  16. import javax.servlet.ServletResponse;
  17. import javax.servlet.http.HttpServletRequest;
  18. /**
  19. * @Author hithedy
  20. * @Date 2016年2月2日
  21. * @Time 下午2:01:53
  22. */
  23. public class XssAndSqlFilter implements Filter {
  24. @Override
  25. public void destroy() {
  26. // TODO Auto-generated method stub
  27. }
  28. @Override
  29. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  30. XssAndSqlHttpServletRequestWrapper xssRequest = new XssAndSqlHttpServletRequestWrapper((HttpServletRequest) request);
  31. chain.doFilter(xssRequest, response);
  32. }
  33. @Override
  34. public void init(FilterConfig arg0) throws ServletException {
  35. // TODO Auto-generated method stub
  36. }
  37. }
  38. 3、包装器
  39. /**
  40. *
  41. */
  42. package com.cup.cms.web.framework.filter;
  43. import java.util.regex.Pattern;
  44. import javax.servlet.http.HttpServletRequest;
  45. import javax.servlet.http.HttpServletRequestWrapper;
  46. /**
  47. * @Author hithedy
  48. * @Date 2016年2月2日
  49. * @Time 下午2:03:19
  50. */
  51. public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrapper {
  52. HttpServletRequest orgRequest = null;
  53. public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) {
  54. super(request);
  55. orgRequest = request;
  56. }
  57. /**
  58. * 覆盖getParameter方法,将参数名和参数值都做xss & sql过滤。
  59. * 假如需要取得原始的值,则通过super.getParameterValues(name)来获取
  60. * getParameterNames,getParameterValues和getParameterMap也可可以需要覆盖
  61. */
  62. @Override
  63. public String getParameter(String name) {
  64. String value = super.getParameter(xssEncode(name));
  65. if (value != null) {
  66. value = xssEncode(value);
  67. }
  68. return value;
  69. }
  70. /**
  71. * 覆盖getHeader方法,将参数名和参数值都做xss & sql过滤。
  72. * 假如需要取得原始的值,则通过super.getHeaders(name)来获取
  73. * getHeaderNames 也可可以需要覆盖
  74. */
  75. @Override
  76. public String getHeader(String name) {
  77. String value = super.getHeader(xssEncode(name));
  78. if (value != null) {
  79. value = xssEncode(value);
  80. }
  81. return value;
  82. }
  83. /**
  84. * 将容易引起xss & sql漏洞的半角字符直接替换成全角字符
  85. *
  86. * @param s
  87. * @return
  88. */
  89. private static String xssEncode(String s) {
  90. if (s == null || s.isEmpty()) {
  91. return s;
  92. }else{
  93. s = stripXSSAndSql(s);
  94. }
  95. StringBuilder sb = new StringBuilder(s.length() + 16);
  96. for (int i = 0; i < s.length(); i++) {
  97. char c = s.charAt(i);
  98. switch (c) {
  99. case '>':
  100. sb.append(“>”);// 转义大于号
  101. break;
  102. case '<':
  103. sb.append(“<”);// 转义小于号
  104. break;
  105. case '\'':
  106. sb.append(“'”);// 转义单引号
  107. break;
  108. case '\”':
  109. sb.append(“"”);// 转义双引号
  110. break;
  111. case '&amp;':
  112. sb.append(“&”);// 转义&amp;
  113. break;
  114. case '#':
  115. sb.append(“#”);// 转义#
  116. break;
  117. default:
  118. sb.append(c);
  119. break;
  120. }
  121. }
  122. return sb.toString();
  123. }
  124. /**
  125. * 获取最原始的request
  126. *
  127. * @return
  128. */
  129. public HttpServletRequest getOrgRequest() {
  130. return orgRequest;
  131. }
  132. /**
  133. * 获取最原始的request的静态方法
  134. *
  135. * @return
  136. */
  137. public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
  138. if (req instanceof XssAndSqlHttpServletRequestWrapper) {
  139. return ((XssAndSqlHttpServletRequestWrapper) req).getOrgRequest();
  140. }
  141. return req;
  142. }
  143. /**
  144. *
  145. * 防止xss跨脚本攻击(替换,根据实际情况调整)
  146. */
  147. public static String stripXSSAndSql(String value) {
  148. if (value != null) {
  149. // NOTE: It's highly recommended to use the ESAPI library and
  150. // uncomment the following line to
  151. // avoid encoded attacks.
  152. // value = ESAPI.encoder().canonicalize(value);
  153. // Avoid null characters
  154. /**value = value.replaceAll(“”, “”);***/
  155. // Avoid anything between script tags
  156. Pattern scriptPattern = Pattern.compile(“(.*?)”, Pattern.CASE_INSENSITIVE);
  157. value = scriptPattern.matcher(value).replaceAll(“”);
  158. // Avoid anything in a src=”http://www.yihaomen.com/article/java/…” type of e-xpression
  159. scriptPattern = Pattern.compile(“src[\r\n| | ]*=[\r\n| | ]*[\\\”|\\\'](.*?)[\\\”|\\\']”, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  160. value = scriptPattern.matcher(value).replaceAll(“”);
  161. // Remove any lonesome tag
  162. scriptPattern = Pattern.compile(“”, Pattern.CASE_INSENSITIVE);
  163. value = scriptPattern.matcher(value).replaceAll(“”);
  164. // Remove any lonesome tag
  165. scriptPattern = Pattern.compile(“”, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  166. value = scriptPattern.matcher(value).replaceAll(“”);
  167. // Avoid eval(…) expressions
  168. scriptPattern = Pattern.compile(“eval\\((.*?)\\)”, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  169. value = scriptPattern.matcher(value).replaceAll(“”);
  170. // Avoid e-xpression(…) expressions
  171. scriptPattern = Pattern.compile(“e-xpression\\((.*?)\\)”, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  172. value = scriptPattern.matcher(value).replaceAll(“”);
  173. // Avoid javascript:… expressions
  174. scriptPattern = Pattern.compile(“javascript[\r\n| | ]*:[\r\n| | ]*”, Pattern.CASE_INSENSITIVE);
  175. value = scriptPattern.matcher(value).replaceAll(“”);
  176. // Avoid vbscript:… expressions
  177. scriptPattern = Pattern.compile(“vbscript[\r\n| | ]*:[\r\n| | ]*”, Pattern.CASE_INSENSITIVE);
  178. value = scriptPattern.matcher(value).replaceAll(“”);
  179. // Avoid onload= expressions
  180. scriptPattern = Pattern.compile(“onload(.*?)=”, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  181. value = scriptPattern.matcher(value).replaceAll(“”);
  182. }
  183. return value;
  184. }
  185. }

可以够防止常见的XSS和SQL注入。

防止常见XSS 过滤 SQL注入 JAVA过滤器filter

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 防止常见XSS 过滤 SQL注入 JAVA过滤器filter

发表回复