您的位置 首页 java

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

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

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

文章来源:智云一二三科技

文章标题:防止常见XSS 过滤 SQL注入 JAVA过滤器filter

文章地址:https://www.zhihuclub.com/176083.shtml

关于作者: 智云科技

热门文章

网站地图