当前位置:   article > 正文

Springboot中使用过滤器校验PSOT类型请求参数内容_spring在过滤器中添加正则校验参数

spring在过滤器中添加正则校验参数

目录

目的

实现步骤

完整代码


目的

        在Springboot中创建过滤器,用来过滤所有POST类型请求并获取body中的参数进行校验内容是否合法;该方法仅适用于POST类型请求,因为POST和GET请求的参数位置不一样所以处理方式也不一样,如果想要实现拦截获取GET类型请求校验参数,可以参考以下示例:

Springboot中拦截GET请求获取请求参数验证合法性icon-default.png?t=N6B9https://blog.csdn.net/weixin_45151960/article/details/132184917?spm=1001.2014.3001.5501

实现步骤

        1、创建Filter过滤器用来过滤所有请求;

        2、将PSOT类型请求中的body参数内容进行转换;

        3、处理body数据进行校验:

                3.1、当body数据仅为json对象时进行处理校验;

                3.2、当body数据仅为json数组时进行处理校验;

                3.3、当body数据为json对象且包含json数组时进行处理校验;

                3.4、当body数据为json数组且包含json对象时进行处理校验;

                

完整代码

        过滤器

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.boc.ljh.utils.Result;
  5. import com.boc.ljh.utils.status.AppErrorCode;
  6. import org.springframework.context.annotation.Configuration;
  7. import javax.servlet.*;
  8. import javax.servlet.annotation.WebFilter;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.Set;
  15. /**
  16. * @Author: ljh
  17. * @ClassName SqlFilter
  18. * @Description 过滤请求内容 防止sql注入
  19. * @date 2023/8/8 16:15
  20. * @Version 1.0
  21. */
  22. @WebFilter(urlPatterns = "/*", filterName = "sqlFilter")
  23. @Configuration
  24. public class SqlFilter implements Filter {
  25. @Override
  26. public void init(FilterConfig filterConfig) {
  27. }
  28. @Override
  29. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  30. HttpServletResponse response = (HttpServletResponse) servletResponse;
  31. response.setContentType("application/json;charset=utf-8");
  32. Result result = new Result();
  33. result.setStatus(500);
  34. result.setMessage(AppErrorCode.REQUEST_DATA_FULL.message);
  35. String data = JSON.toJSONString(result);
  36. BodyReaderRequestWrapper wrapper = null;
  37. HttpServletRequest request = (HttpServletRequest) servletRequest;
  38. if (request.getMethod().equals("POST")) {
  39. String contentType = request.getContentType();
  40. if ("application/json".equals(contentType)) {
  41. wrapper = new BodyReaderRequestWrapper(request);
  42. String requestPostStr = wrapper.getBody();
  43. if (requestPostStr.startsWith("{")) {
  44. //解析json对象
  45. boolean b = resolveJSONObjectObj(requestPostStr);
  46. if (!b) {
  47. response.getWriter().print(data);
  48. return;
  49. }
  50. } else if (requestPostStr.startsWith("[")) {
  51. //把数据转换成json数组
  52. JSONArray jsonArray = JSONArray.parseArray(requestPostStr);
  53. List<String> list = JSONObject.parseArray(jsonArray.toJSONString(), String.class);
  54. for (String str : list) {
  55. if (str.startsWith("{")) {
  56. //解析json对象
  57. boolean b = resolveJSONObjectObj(requestPostStr);
  58. if (!b) {
  59. response.getWriter().print(data);
  60. return;
  61. }
  62. } else {
  63. boolean b = verifySql(str);
  64. if (b) {
  65. try {
  66. response.getWriter().print(data);
  67. return;
  68. } catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. }
  73. }
  74. }
  75. } else {
  76. //application/x-www-form-urlencoded
  77. Map<String, String[]> parameterMap = request.getParameterMap();
  78. for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
  79. //校验参数值是否合法
  80. String[] value = entry.getValue();
  81. for (String s : value) {
  82. //校验参数值是否合法
  83. boolean b = verifySql(s);
  84. if (b) {
  85. response.getWriter().print(data);
  86. return;
  87. }
  88. }
  89. }
  90. }
  91. }
  92. if (wrapper == null) {
  93. filterChain.doFilter(servletRequest, servletResponse);
  94. } else {
  95. filterChain.doFilter(wrapper, servletResponse);
  96. }
  97. }
  98. /**
  99. * @Author: ljh
  100. * @Description: 对JSONObject对象进行递归参数解析
  101. * @DateTime: 14:26 2023/8/9
  102. * @Params:
  103. * @Return
  104. */
  105. private boolean resolveJSONObjectObj(String requestPostStr) {
  106. boolean isover = true;
  107. // 创建需要处理的json对象
  108. JSONObject jsonObject = JSONObject.parseObject(requestPostStr);
  109. // 获取所有的参数key
  110. Set<String> keys = jsonObject.keySet();
  111. if (keys.size() > 0) {
  112. for (String key : keys) {
  113. //获取参数名称
  114. String value;
  115. if (jsonObject.get(key) != null) {
  116. value = String.valueOf(jsonObject.get(key));
  117. //当value为数组时
  118. if (value.startsWith("[")) {
  119. //把数据转换成json数组
  120. JSONArray jsonArray = JSONArray.parseArray(value);
  121. for (Object o : jsonArray) {
  122. if (o.toString().startsWith("{")) {
  123. //解析json对象
  124. boolean b = resolveJSONObjectObj(o.toString());
  125. if (!b) {
  126. isover = false;
  127. break;
  128. }
  129. } else {
  130. boolean b = verifySql(value);
  131. if (b) {
  132. isover = false;
  133. break;
  134. }
  135. }
  136. }
  137. } else if (value.startsWith("{")) {
  138. boolean b = resolveJSONObjectObj(value);
  139. if (!b) {
  140. isover = false;
  141. break;
  142. }
  143. } else {
  144. //校验参数值是否合法
  145. boolean b = verifySql(value);
  146. if (b) {
  147. isover = false;
  148. break;
  149. }
  150. }
  151. }
  152. }
  153. }
  154. return isover;
  155. }
  156. @Override
  157. public void destroy() {
  158. }
  159. /**
  160. * @Author: ljh
  161. * @Description: 校验参数非法字符
  162. * @DateTime: 14:26 2023/8/9
  163. * @Params:
  164. * @Return
  165. */
  166. public boolean verifySql(String parameter) {
  167. String s = parameter.toLowerCase();
  168. // 过滤掉的sql关键字,特殊字符前面需要加\\进行转义
  169. String badStr =
  170. "select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|" +
  171. "char|declare|sitename|xp_cmdshell|like|from|grant|use|group_concat|column_name|" +
  172. "information_schema.columns|table_schema|union|where|order|by|" +
  173. "'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";
  174. //使用正则表达式进行匹配
  175. boolean matches = s.matches(badStr);
  176. return matches;
  177. }
  178. }

        解析body数据 工具类

  1. import javax.servlet.ReadListener;
  2. import javax.servlet.ServletInputStream;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletRequestWrapper;
  5. import java.io.*;
  6. /**
  7. * @Author: ljh
  8. * @ClassName BodyReaderRequestWrapper
  9. * @Description 解析body数据
  10. * @date 2023/8/8 16:14
  11. * @Version 1.0
  12. */
  13. public class BodyReaderRequestWrapper extends HttpServletRequestWrapper {
  14. private final String body;
  15. public String getBody() {
  16. return body;
  17. }
  18. /**
  19. * 取出请求体body中的参数(创建对象时执行)
  20. *
  21. * @param request
  22. */
  23. public BodyReaderRequestWrapper(HttpServletRequest request) throws IOException {
  24. super(request);
  25. StringBuilder sb = new StringBuilder();
  26. InputStream ins = request.getInputStream();
  27. BufferedReader isr = null;
  28. try {
  29. if (ins != null) {
  30. isr = new BufferedReader(new InputStreamReader(ins));
  31. char[] charBuffer = new char[128];
  32. int readCount;
  33. while ((readCount = isr.read(charBuffer)) != -1) {
  34. sb.append(charBuffer, 0, readCount);
  35. }
  36. }
  37. } finally {
  38. if (isr != null) {
  39. isr.close();
  40. }
  41. }
  42. sb.toString();
  43. body = sb.toString();
  44. }
  45. @Override
  46. public BufferedReader getReader() {
  47. return new BufferedReader(new InputStreamReader(this.getInputStream()));
  48. }
  49. @Override
  50. public ServletInputStream getInputStream() {
  51. final ByteArrayInputStream byteArrayIns = new ByteArrayInputStream(body.getBytes());
  52. return new ServletInputStream() {
  53. @Override
  54. public boolean isFinished() {
  55. return false;
  56. }
  57. @Override
  58. public boolean isReady() {
  59. return false;
  60. }
  61. @Override
  62. public void setReadListener(ReadListener readListener) {
  63. }
  64. @Override
  65. public int read() {
  66. return byteArrayIns.read();
  67. }
  68. };
  69. }
  70. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/310724?site=
推荐阅读
相关标签
  

闽ICP备14008679号