当前位置:   article > 正文

Springboot中拦截GET请求获取请求参数验证合法性_get请求参数校验

get请求参数校验

目录

目的

核心方法

完整代码

        创建拦截器

        注册拦截器

测试效果


目的

        在Springboot中创建拦截器拦截所有GET类型请求,获取请求参数验证内容合法性防止SQL注入(该方法仅适用拦截GET类型请求,POST类型请求参数是在body中,所以下面方法不适用)。

核心方法

        1、拦截 http://127.0.0.1:8088/api/checkTechCertInfoCancel?name=ljh 类型:

Map<String, String[]> parameterMap = request.getParameterMap();

        2、拦截 http://127.0.0.1:8088/api/checkTechCertInfoCancel/ljh 类型:

Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

完整代码

        创建拦截器

  1. import com.alibaba.fastjson.JSON;
  2. import com.boc.ljh.utils.Result;
  3. import com.boc.ljh.utils.status.AppErrorCode;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.web.servlet.HandlerInterceptor;
  6. import org.springframework.web.servlet.HandlerMapping;
  7. import org.springframework.web.servlet.ModelAndView;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import java.util.Map;
  11. /**
  12. * @Author: ljh
  13. * @ClassName SqlInterceptor
  14. * @Description 拦截器 用于拦截GET请求校验参数内容
  15. * @date 2023/8/9 10:12
  16. * @Version 1.0
  17. */
  18. @Component
  19. public class SqlInterceptor implements HandlerInterceptor {
  20. /**
  21. * @Author: ljh
  22. * @Description: 在controller前拦截请求
  23. * @DateTime: 10:38 2023/8/9
  24. * @Params:
  25. * @Return
  26. */
  27. @Override
  28. public boolean preHandle(HttpServletRequest request,
  29. HttpServletResponse response, Object handler) throws Exception {
  30. System.err.println(request.getMethod());
  31. if (request.getMethod().equals("GET") && request.getRequestURI().contains("?")) {
  32. //获取EGT请求中的参数,例如http://127.0.0.1:8088/api/checkTechCertInfoCancel?name=ljh 请求中的参数ljh
  33. Map<String, String[]> parameterMap = request.getParameterMap();
  34. for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
  35. String[] value = entry.getValue();
  36. for (String s : value) {
  37. //校验参数值是否合法
  38. if (verifySql(s)) {
  39. response.setContentType("application/json;charset=utf-8");
  40. Result result = new Result();
  41. result.setMessage("请求参数中含有非法字符!请检查重新输入");
  42. result.setStatus(500);
  43. response.getWriter().write(JSON.toJSONString(result));
  44. return false;
  45. }
  46. }
  47. }
  48. } else {
  49. //获取EGT请求中的参数,例如http://127.0.0.1:8088/api/checkTechCertInfoCancel/ljh 请求中的参数ljh
  50. Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
  51. for (String key : pathVariables.keySet()) {
  52. //校验参数值是否合法
  53. if (verifySql(pathVariables.get(key))) {
  54. //返回错误提示
  55. response.setContentType("application/json;charset=utf-8");
  56. Result result = new Result();
  57. result.setMessage("请求参数中含有非法字符!请检查重新输入");
  58. result.setStatus(500);
  59. response.getWriter().write(JSON.toJSONString(result));
  60. return false;
  61. }
  62. }
  63. }
  64. return true;
  65. }
  66. //处理请求完成后视图渲染之前的处理操作
  67. @Override
  68. public void postHandle(HttpServletRequest request,
  69. HttpServletResponse response, Object handler,
  70. ModelAndView modelAndView) throws Exception {
  71. // TODO Auto-generated method stub
  72. }
  73. //视图渲染之后的操作
  74. @Override
  75. public void afterCompletion(HttpServletRequest request,
  76. HttpServletResponse response, Object handler, Exception ex)
  77. throws Exception {
  78. // TODO Auto-generated method stub
  79. }
  80. /**
  81. * @Author: ljh
  82. * @Description: 校验非法字符
  83. * @DateTime: 11:15 2023/8/9
  84. * @Params:
  85. * @Return
  86. */
  87. public boolean verifySql(String parameter) {
  88. String s = parameter.toLowerCase();
  89. // 过滤掉的sql关键字,特殊字符前面需要加\\进行转义
  90. String badStr =
  91. "select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|" +
  92. "char|declare|sitename|xp_cmdshell|like|from|grant|use|group_concat|column_name|" +
  93. "information_schema.columns|table_schema|union|where|order|by|" +
  94. "'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";
  95. //使用正则表达式进行匹配
  96. boolean matches = s.matches(badStr);
  97. return matches;
  98. }

        注册拦截器

  1. /**
  2. * @Author: ljh
  3. * @ClassName MvcInterceptorConfig
  4. * @Description 注册SqlInterceptor拦截器到容器中
  5. * @date 2023/8/9 10:21
  6. * @Version 1.0
  7. */
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  10. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  11. @Configuration
  12. public class MvcInterceptorConfig implements WebMvcConfigurer {
  13. @Override
  14. public void addInterceptors(InterceptorRegistry registry) {
  15. registry.addInterceptor(new SqlInterceptor()) //需要注册到容器中的拦截器
  16. .addPathPatterns("/**"); //所有请求都被拦截,静态资源也被拦截
  17. // .excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/images/**", "/js/**"); // 放行的请求
  18. }
  19. }

测试效果

        请求内容合法:

        请求内容不合法:

Springboot中使用过滤器校验PSOT类型请求参数内容icon-default.png?t=N6B9https://blog.csdn.net/weixin_45151960/article/details/132187495?spm=1001.2014.3001.5501​​​​​​​

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

闽ICP备14008679号