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

news/2024/11/16 18:01:16

目录

目的

核心方法

完整代码

        创建拦截器

        注册拦截器

测试效果


目的

        在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);

完整代码

        创建拦截器

import com.alibaba.fastjson.JSON;
import com.boc.ljh.utils.Result;
import com.boc.ljh.utils.status.AppErrorCode;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;


/**
 * @Author: ljh
 * @ClassName SqlInterceptor
 * @Description 拦截器 用于拦截GET请求校验参数内容
 * @date 2023/8/9 10:12
 * @Version 1.0
 */
@Component
public class SqlInterceptor implements HandlerInterceptor {

    /**
     * @Author: ljh
     * @Description: 在controller前拦截请求
     * @DateTime: 10:38 2023/8/9
     * @Params:
     * @Return
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        System.err.println(request.getMethod());
        if (request.getMethod().equals("GET") && request.getRequestURI().contains("?")) {
            //获取EGT请求中的参数,例如http://127.0.0.1:8088/api/checkTechCertInfoCancel?name=ljh 请求中的参数ljh
            Map<String, String[]> parameterMap = request.getParameterMap();
            for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
                String[] value = entry.getValue();
                for (String s : value) {
                    //校验参数值是否合法
                    if (verifySql(s)) {
                        response.setContentType("application/json;charset=utf-8");
                        Result result = new Result();
                        result.setMessage("请求参数中含有非法字符!请检查重新输入");
                        result.setStatus(500);
                        response.getWriter().write(JSON.toJSONString(result));
                        return false;
                    }
                }
            }
        } else {
            //获取EGT请求中的参数,例如http://127.0.0.1:8088/api/checkTechCertInfoCancel/ljh 请求中的参数ljh
            Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
            for (String key : pathVariables.keySet()) {
                //校验参数值是否合法
                if (verifySql(pathVariables.get(key))) {
                    //返回错误提示
                    response.setContentType("application/json;charset=utf-8");
                    Result result = new Result();
                    result.setMessage("请求参数中含有非法字符!请检查重新输入");
                    result.setStatus(500);
                    response.getWriter().write(JSON.toJSONString(result));
                    return false;
                }
            }
        }
        return true;
    }

    //处理请求完成后视图渲染之前的处理操作
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub

    }

    //视图渲染之后的操作
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub

    }


    /**
     * @Author: ljh
     * @Description: 校验非法字符
     * @DateTime: 11:15 2023/8/9
     * @Params:
     * @Return
     */
    public boolean verifySql(String parameter) {
        String s = parameter.toLowerCase();
        // 过滤掉的sql关键字,特殊字符前面需要加\\进行转义
        String badStr =
                "select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|" +
                        "char|declare|sitename|xp_cmdshell|like|from|grant|use|group_concat|column_name|" +
                        "information_schema.columns|table_schema|union|where|order|by|" +
                        "'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";

        //使用正则表达式进行匹配
        boolean matches = s.matches(badStr);
        return matches;
    }

        注册拦截器

/**
 * @Author: ljh
 * @ClassName MvcInterceptorConfig
 * @Description 注册SqlInterceptor拦截器到容器中
 * @date 2023/8/9 10:21
 * @Version 1.0
 */

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MvcInterceptorConfig implements WebMvcConfigurer {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SqlInterceptor()) //需要注册到容器中的拦截器
                .addPathPatterns("/**"); //所有请求都被拦截,静态资源也被拦截
//                .excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/images/**", "/js/**"); // 放行的请求
    }

}

测试效果

        请求内容合法:

        请求内容不合法:

 


http://www.niftyadmin.cn/n/4924525.html

相关文章

【JS】前端日期格式转化函数

/*** 日期时间格式转化* param date 时间* param fmt 转化格式 yyyy-MM-dd hh:mm:ss 不传转成&#xff1a;yyyy-MM-dd* returns 格式时间字符*/ const formatDate (date, fmt yyyy-MM-dd) > {if (date null) return;if (typeof (date) string || typeof (date) number)…

122、SpringBoot中有几种定义Bean的方式?

SpringBoot中有几种定义Bean的方式? SpringBoot中有几种定义Bean的方式?代码栗子演示1、@Bean2. @Component3. @Controller、@RestController、@Service、@Repository4. @ControllerAdvice、@RestControllerAdvice5. @Configuration6. @Import7. BeanDefinition8. \<bean\…

AIGC技术到底是什么?为什么这么火热?

AIGC技术到底是什么&#xff1f;为什么这么火热&#xff1f; ALCG技术到底是什么&#xff1f;AIGC技术的发展史AIGC技术特点AIGC技术主要用途ALGC技术未来发展 ALCG技术到底是什么&#xff1f; AIGC&#xff08;Artificial Intelligence in Game Creation&#xff09;技术是指…

整理书籍遇到的知识点

1.SDL Game Development 是什么意思&#xff1f; SDL&#xff08;Simple DirectMedia Layer&#xff09;是一个跨平台的多媒体库&#xff0c;用于开发图形、音频和输入处理等功能的应用程序。SDL 提供了一组简单而强大的API&#xff0c;使开发者能够轻松地创建游戏和其他多媒体…

flask处理token的装饰器

以下是在 Flask 中基于 token 实现的登录验证装饰器的示例代码&#xff1a; import jwt from functools import wraps from flask import request, jsonify, current_appdef login_required(f):wraps(f)def decorated_function(*args, **kwargs):token request.headers.get(A…

第二章-算法

第二章-算法 数据结构和算法的关系 算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 算法的特性 算法有五个基本特征&#xff1a;输入、输出、有穷性、确定性和可行性。 输入&#xff1a;算法具…

Python-OpenCV中的图像处理-图像阀值

Python-OpenCV中的图像处理-图像阀值 图像阈值单阈值自适应阈值Otsus二值化 图像阈值 单阈值 与名字一样&#xff0c;这种方法非常简单。但像素值高于阈值时&#xff0c;我们给这个像素赋予一个新值&#xff08;可能是白色&#xff09;&#xff0c;否则我们给它赋予另外一种颜…

实现静态资源访问的几种方法

什么是静态资源&#xff1f; 静态资源是指在服务器端存储的不会变化的文件&#xff0c;如HTML、CSS、JavaScript、图片、音频、视频等文件。这些文件一般不包含动态内容&#xff0c;每次请求时返回的内容都是固定的。 为什么要使用静态资源&#xff1f; 提升网站性能&#xf…