Springboot中使用过滤器校验PSOT类型请求参数内容

目录

目的

实现步骤

完整代码


目的

        在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对象时进行处理校验;

                

完整代码

        过滤器

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.boc.ljh.utils.Result;
import com.boc.ljh.utils.status.AppErrorCode;
import org.springframework.context.annotation.Configuration;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;/*** @Author: ljh* @ClassName SqlFilter* @Description 过滤请求内容 防止sql注入* @date 2023/8/8 16:15* @Version 1.0*/@WebFilter(urlPatterns = "/*", filterName = "sqlFilter")
@Configuration
public class SqlFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) servletResponse;response.setContentType("application/json;charset=utf-8");Result result = new Result();result.setStatus(500);result.setMessage(AppErrorCode.REQUEST_DATA_FULL.message);String data = JSON.toJSONString(result);BodyReaderRequestWrapper wrapper = null;HttpServletRequest request = (HttpServletRequest) servletRequest;if (request.getMethod().equals("POST")) {String contentType = request.getContentType();if ("application/json".equals(contentType)) {wrapper = new BodyReaderRequestWrapper(request);String requestPostStr = wrapper.getBody();if (requestPostStr.startsWith("{")) {//解析json对象boolean b = resolveJSONObjectObj(requestPostStr);if (!b) {response.getWriter().print(data);return;}} else if (requestPostStr.startsWith("[")) {//把数据转换成json数组JSONArray jsonArray = JSONArray.parseArray(requestPostStr);List<String> list = JSONObject.parseArray(jsonArray.toJSONString(), String.class);for (String str : list) {if (str.startsWith("{")) {//解析json对象boolean b = resolveJSONObjectObj(requestPostStr);if (!b) {response.getWriter().print(data);return;}} else {boolean b = verifySql(str);if (b) {try {response.getWriter().print(data);return;} catch (IOException e) {e.printStackTrace();}}}}}} else {//application/x-www-form-urlencodedMap<String, String[]> parameterMap = request.getParameterMap();for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {//校验参数值是否合法String[] value = entry.getValue();for (String s : value) {//校验参数值是否合法boolean b = verifySql(s);if (b) {response.getWriter().print(data);return;}}}}}if (wrapper == null) {filterChain.doFilter(servletRequest, servletResponse);} else {filterChain.doFilter(wrapper, servletResponse);}}/*** @Author: ljh* @Description: 对JSONObject对象进行递归参数解析* @DateTime: 14:26 2023/8/9* @Params:* @Return*/private boolean resolveJSONObjectObj(String requestPostStr) {boolean isover = true;// 创建需要处理的json对象JSONObject jsonObject = JSONObject.parseObject(requestPostStr);// 获取所有的参数keySet<String> keys = jsonObject.keySet();if (keys.size() > 0) {for (String key : keys) {//获取参数名称String value;if (jsonObject.get(key) != null) {value = String.valueOf(jsonObject.get(key));//当value为数组时if (value.startsWith("[")) {//把数据转换成json数组JSONArray jsonArray = JSONArray.parseArray(value);for (Object o : jsonArray) {if (o.toString().startsWith("{")) {//解析json对象boolean b = resolveJSONObjectObj(o.toString());if (!b) {isover = false;break;}} else {boolean b = verifySql(value);if (b) {isover = false;break;}}}} else if (value.startsWith("{")) {boolean b = resolveJSONObjectObj(value);if (!b) {isover = false;break;}} else {//校验参数值是否合法boolean b = verifySql(value);if (b) {isover = false;break;}}}}}return isover;}@Overridepublic void destroy() {}/*** @Author: ljh* @Description: 校验参数非法字符* @DateTime: 14:26 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;}}

        解析body数据 工具类

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;/*** @Author: ljh* @ClassName BodyReaderRequestWrapper* @Description 解析body数据* @date 2023/8/8 16:14* @Version 1.0*/public class BodyReaderRequestWrapper extends HttpServletRequestWrapper {private final String body;public String getBody() {return body;}/*** 取出请求体body中的参数(创建对象时执行)** @param request*/public BodyReaderRequestWrapper(HttpServletRequest request) throws IOException {super(request);StringBuilder sb = new StringBuilder();InputStream ins = request.getInputStream();BufferedReader isr = null;try {if (ins != null) {isr = new BufferedReader(new InputStreamReader(ins));char[] charBuffer = new char[128];int readCount;while ((readCount = isr.read(charBuffer)) != -1) {sb.append(charBuffer, 0, readCount);}}} finally {if (isr != null) {isr.close();}}sb.toString();body = sb.toString();}@Overridepublic BufferedReader getReader() {return new BufferedReader(new InputStreamReader(this.getInputStream()));}@Overridepublic ServletInputStream getInputStream() {final ByteArrayInputStream byteArrayIns = new ByteArrayInputStream(body.getBytes());return new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() {return byteArrayIns.read();}};}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/83598.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka:安装和配置

producer&#xff1a;发布消息的对象&#xff0c;称为消息产生者 &#xff08;Kafka topic producer&#xff09; topic&#xff1a;Kafka将消息分门别类&#xff0c;每一个消息称为一个主题&#xff08;topic&#xff09; consumer&#xff1a;订阅消息并处理发布消息的对象…

vue 点击顶部tab重新请求列表

我们点击 1 2 来回切换时,发现客户经理的列表不会重新请求(菜单中含有客户经理) 这时我们添加以下代码就可以了 watch: {$route(route) {this.getList()}},/** 查询客户经理列表 */getList() {this.loading true;listManager(this.queryParams).then(response > {this.mana…

B2B2C多用户手机购物商城快速搭建(java开源)

要快速搭建一个B2B2C多用户手机购物商城&#xff0c;需要使用Java语言和开源框架进行开发。以下是一个基本的搭建步骤&#xff1a; 选择合适的开发框架 首先需要选择一个适合开发B2B2C多用户手机购物商城的Java开源框架&#xff0c;它提供了丰富的功能模块和灵活的扩展性&…

【论文阅读】对抗溯源图主机入侵检测系统的模仿攻击(NDSS-2023)

作者&#xff1a;伊利诺伊大学芝加哥分校-Akul Goyal、Gang Wang、Adam Bates&#xff1b;维克森林大学-Xueyuan Han、 引用&#xff1a;Goyal A, Han X, Wang G, et al. Sometimes, You Aren’t What You Do: Mimicry Attacks against Provenance Graph Host Intrusion Detect…

AD19 基础应用技巧(PCB设置快捷键)

众所周知&#xff0c;学会一个软件的快捷键操作可以大大提高我们的工作效率。 那么&#xff0c;Altium Designer软件如何设置快捷键&#xff1f; 以设置走线/放置过孔为例。 菜单栏 - 【放置】- 然后【Ctrl 鼠标左键 单击过孔】进入【Edit Command】界面。 在快捷方式一栏…

【JavaSE】接口的语法知识和使用方法总结

目录 1. 接口的概念 2. 语法规则 3. 接口特性 4. 接口使用 5. 实现多个接口 6. 接口间的继承 1. 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#x…

利用ChatGPT成功减肥20多斤!专业教练都表示它的建议实际上真有帮助

一份由ChatGPT创建的锻炼计划成功帮助一位男士爱上跑步&#xff0c;并减重26磅&#xff08;23.59斤&#xff09;。一位专业教练表示&#xff0c;这份由人工智能生成的减肥计划实际上确实很有帮助。 这位男士曾经非常厌恶跑步&#xff0c;但在使用ChatGPT三个月后表示&#xff0…

session-cookies 三个缓存 localStorage、sessionStorage、Cookies。

session-cookies session-cookies is localStorage、sessionStorage、Cookies。session-cookies This plugin is used to summarize the browser’s three caches localStorage, sessionStorage, Cookies.The plugin is designed to be quick and easy to use. Below is a sum…

jmeter 二次开发详解

目录 背景&#xff1a; 自定义 BeanShell 功能 自定义请求编写&#xff08;Java Sampler&#xff09; 实现 Java Sampler 功能的两种方式 案例&#xff1a;使用 JavaSampler 重写 HTTP 的 POST 请求 自定义函数助手 背景&#xff1a; JMeter 是一个功能强大的性能测试工具…

杂记 | 记录一次使用Docker安装gitlab-ce的过程(含配置交换内存)

文章目录 01 准备工作02 &#xff08;可选&#xff09;配置交换内存03 编辑docker-compose.yml04 启动并修改配置05 nginx反向代理06 &#xff08;可选&#xff09;修改配置文件07 访问并登录 01 准备工作 最近想自建一个gitlab服务来保存自己的项目&#xff0c;于是找到gitla…

PC端自动化工具pywinauto:如何选择应用程序的窗口?

如何选择需要打开的应用程序的窗口有2种方法&#xff1a; ①通过窗口标题/窗口类名来打开应用程序窗口&#xff0c;第一步就要打开窗口精灵&#xff0c;通过拖动放大镜到应用窗口找到窗口标题和窗口类名&#xff0c;如下图所示&#xff1a; 接下来就可以根据窗口类名和标题选择…

Unity 基础函数

Mathf&#xff1a; //1.π-PI print(Mathf.PI); //2.取绝对值-Abs print(Mathf.Abs(-10)); print(Mathf.Abs(-20)); print(Mathf.Abs(1)); //3.向上取整-Ce il To In t float f 1.3f; int i (int)f; …

TSINGSEE青犀视频汇聚平台EasyCVR视频广场面包屑侧边栏支持拖拽操作

TSINGSEE青犀视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、Web…

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…

CLION编译后的exe文件添加ico图标

编译前准备 1.编译ico.rc>ico.o 将图标放到工程目录下 新建ico.rc文件 id ICON "spoon.ico" //添加图标 #include <winver.h> VS_VERSION_INFO VERSIONINFOFILEVERSION 1,0,0,10PRODUCTVERSION 1,0,0,10FILEFLAGSMASK 0x3fL #ifdef _DEBUGFILEFLAGS VS_FF…

js 使用 Object.defineProperty() 对属性进行限制 06

小夏小夏&#xff0c;可爱爆炸 &#x1f923; &#x1f495;&#x1f495;&#x1f495; 文章目录 前言一、对属性操作的控制二、属性描述符三、数据属性描述符四、存取属性描述符 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人…

查看gz文件 linux zcat file.gz mtx.gz

可以使用以下命令来查看 gz 压缩文件的内容&#xff1a; zcat file.gz 1 该命令会将 file.gz 文件解压并输出到标准输出&#xff0c;可以通过管道符将其与 grep 命令结合使用来查找需要的关键词&#xff0c;例如&#xff1a; zcat file.gz | grep keyword 1 该命令会将 file.gz…

Unity 打造游戏攻击技能架构与设计

一、技能系统的设计 在 MOBA 游戏中&#xff0c;每个英雄角色都会有多个技能&#xff0c;这些技能可以分为普通攻击和技能攻击两种。普通攻击是英雄角色的基本攻击方式&#xff0c;而技能攻击则需要消耗一定的资源&#xff08;如蓝量&#xff09;才能使用。在设计技能系统时&a…

在家构建您的迷你聊天Chat gpt

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 什么是指令遵循模型&#xff1f; 语言模型是机器学习模型&#xff0c;可以根据句子的前一个单词预测单词概率。如果我们向模型请求下一个单词&#xff0c;并将其递减地反馈给模型以请求更多单词&#xff…

【80天学习完《深入理解计算机系统》】第三天 2.3 整数运算【正负溢出】【运算的溢出】【类型转换的二进制扩展】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…