基于springboot的sql防注入过滤器

目录

  • 何为SQL注入
  • 基于springboot的sql防注入过滤器


回到顶部

何为SQL注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

举例:

select * from login_user where username = ? and password = ?

假如这是一个用户登录时的查询语句。 

如果没有sql防注入措施,那么当攻击者输入 '' or 1 = 1 时,username =  '' or 1 = 1 ,这条查询语句必然会通过,导致攻击者可以随意登录。

回到顶部

基于springboot的sql防注入过滤器

我们可以通过构建一个过滤器,过滤每个消息,如果消息是那种敏感词汇,则过滤掉。

第一步:

新建一个SqlFilter类实现Filter接口,相应地实现Filter接口的三个方法。

 第二步:

在SqlFilter类上添加两个注解:@WebFilter   @Configuration

@WebFilter(urlPatterns = "/*",filterName = "sqlFilter") :

    urlPatterns:表示过滤的范围," /* "表示过滤所有请求路径,"/project/user/login" 则表示过滤http://localhost:8080/project/user/login这个路径的请求。

    filterName:表示这个过滤器的名称

@Configuration:表明当前类是一个配置类。              

 第三步:

在springboot启动类上增加一个注解:

@ServletComponentScan()

    basePackages:过滤器的路径。

 第四步:

编写过滤条件:在SqlFilter类继承自Filter接口的doFilter方法中编写过滤条件。

 @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ServletRequest request = servletRequest;
        ServletResponse response = servletResponse;
        //获得所有请求参数名
        Enumeration<String> names = request.getParameterNames();
        String sql = "";
        while (names.hasMoreElements()){
            //得到参数名
            String name = names.nextElement().toString();
            //得到参数对应值
            String[] values = request.getParameterValues(name);
            for (int i = 0; i < values.length; i++) {
                sql += values[i];
            }
        }
        if (sqlValidate(sql)){
            throw new IOException("您发送请求中的参数中含有非法字符");
        } else {
            filterChain.doFilter(request,response);
        }
    }

    //效验
    protected static boolean sqlValidate(String str){
        String s = str.toLowerCase();//统一转为小写
        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|" +
                "'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";//过滤掉的sql关键字,特殊字符前面需要加\\进行转义
        //使用正则表达式进行匹配
        boolean matches = s.matches(badStr);
        return matches;
}

自此,一个sql防注入过滤器就完成了。

源码:

package com.kingpoint.kingstd.common.utils;

import org.springframework.context.annotation.Configuration;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.Enumeration;


/**
 * @Author chenzhanfan
 * @Date 2021/7/19
 * @Description  sql防注入过滤器
 */
@WebFilter(urlPatterns = "/*",filterName = "sqlFilter")
@Configuration
public class SqlFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ServletRequest request = servletRequest;
        ServletResponse response = servletResponse;
        //获得所有请求参数名
        Enumeration<String> names = request.getParameterNames();
        String sql = "";
        while (names.hasMoreElements()){
            //得到参数名
            String name = names.nextElement().toString();
            //得到参数对应值
            String[] values = request.getParameterValues(name);
            for (int i = 0; i < values.length; i++) {
                sql += values[i];
            }
        }
        if (sqlValidate(sql)){
            throw new IOException("您发送请求中的参数中含有非法字符");
        } else {
            filterChain.doFilter(request,response);
        }
    }

    //效验
    protected static boolean sqlValidate(String str){
        String s = str.toLowerCase();//统一转为小写
        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|" +
                "'\\*|\\;|\\-|\\--|\\+|\\,|\\//|\\/|\\%|\\#";//过滤掉的sql关键字,特殊字符前面需要加\\进行转义
        //使用正则表达式进行匹配
        boolean matches = s.matches(badStr);
        return matches;
}

    @Override
    public void destroy() {

    }
}

                

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

牛客网BC12-字符圣诞树

字符圣诞树 解题思路&#xff1a; 确定行数&#xff0c;一共5行&#xff0c;循环5次确定每行答应的内容&#xff0c;分成两部分&#xff0c;空格和字符 打印空格的个数依次递减打印字符的个数依次递增 找出打印空格和字符的个数与行数之间的关系 int main() {char ch 0;scanf(…

C# StringBuilder对比string的优点和15大案例

文章目录 StringBuilder和String 对比1. **循环内字符串连接**2. **构建大型日志消息**3. **格式化长字符串**4. **SQL 查询构造**5. **从文件读取并合并行**6. **拼接数组元素**7. **格式化电子邮件模板**8. **处理用户输入流**9. **JSON 或 XML 格式的序列化与构建**10. **动…

静态网页设计——天行九歌(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1de411m7y4/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

光明源@智慧环卫新标杆,智慧公厕系统全面升级

在城市的喧嚣之中&#xff0c;一个看似不太引人注目但却无法忽视的领域正在经历一场革命性的变革。作为城市基础设施的一部分&#xff0c;公厕一直以来被人们忽略&#xff0c;然而&#xff0c;随着科技的迅速发展&#xff0c;一项前所未有的升级正向我们走来——智慧公厕系统。…

2024.1.7周报

目录 摘要 ABSTRACT 一、文献阅读 1、题目 2、摘要 3、模型架构 4、文献解读 一、Introduction 二、创新点 三、实验过程 四、结论 二、深度学习知识 一、从Encoder-Decoder框架中理解为什么要有Attention机制 二、Attention思想 三、Seq2Seq Attention代码逐…

【C++】- 类和对象(!!C++类基本概念!this指针详解)

类和对象 引入类类的定义类的访问限定操作符类的作用域类的实例化类对象模型this指针 引入类 在 C中&#xff0c;引入了一个新的定义----------类。类是一种用户自定义的数据类型&#xff0c;用于封装数据和行为。类可以看作是一个模板或蓝图&#xff0c;描述了一组相关的数据和…

CCC数字钥匙设计【NFC】--NFC通信之APDU TLV

CCC3.0&#xff0c;包含NFC、BLE、UWB技术。当采用NFC通信时&#xff0c;车端与手机端是通过APDU来进行交互的。而在APDU中的data数据段&#xff0c;又可能会嵌入TLV协议的数据&#xff0c;以完成车端与手机端的通信交互。 本文先介绍APDU及TLV的一些基础知识&#xff0c;再通…

书生·浦语大模型第二课作业

作业一&#xff1a;小故事创作 作业要求&#xff1a;使用 InternLM-Chat-7B 模型生成 300 字的小故事&#xff08;需截图&#xff09; 完成情况&#xff1a; 作业二&#xff1a;熟悉 hugging face 下载功能 作业要求&#xff1a;熟悉 hugging face 下载功能&#xff0c;使用…

Anaconda 环境中安装OpenCV (cv2)

1、使用Anaconda 的对应环境&#xff0c;查看环境中的Python版本号 (1)使用Anaconda 查看存在的环境&#xff1a;conda info --env (2)激活环境&#xff1a;conda activate XXX 2、根据版本号&#xff0c;下载对应的 python-opencv 包 &#xff08;1&#xff09;选择国内源的…

[MySQL]视图索引以及连接查询案列

目录 1.视图 1.1视图是什么 1.2视图的作用 1.3操作 1.3.1创建视图 1.3.2视图的修改 1.3.3删除视图 1.3.4查看视图 2.索引 2.1什么是索引 2.2为什么要使用索引 2.3索引的优缺点 2.3.1优点 2.3.2缺点 2.4索引的分类 3.连接查询案列 4.思维导图 1.视图 1.1视图是什么 视图…

el-table魔改样式出现BUG,表格内容区域出现滚动条

问题&#xff1a;el-table表格内容区域在高度自适应的情况下冒出滚动条 解决办法&#xff1a; 代码排查后发现时我设置了fixed:“xxx” 属性就会导致滚动条出现的问题&#xff0c;不设置则无。 [{ type: index, label: 序号, fixed: left },{ prop: enterprisesName, label: …

【C++】带你学会使用C++线程库thread、原子库atomic、互斥量库mutex、条件变量库condition_variable

C线程相关知识讲解 前言正式开始C官方为啥要提供线程库thread构造函数代码演示this_threadget_id()yield()sleep_until和sleep_for mutex构造函数lock和unlock上锁全局锁局部锁lambda表达式 try_lock 其他锁时间锁递归版本专用锁recursive_mutex 锁的异常处理lock_guardunique_…

springboot整合缓存技术

缓存&#xff08;cache&#xff09; 为啥需要使用缓存 问题描述&#xff1a;企业级应用主要作用是信息处理&#xff0c;当需要读取数据时&#xff0c;由于受限于数据库的访问效率&#xff0c;导致整体系统性能偏低。&#xff08;就是说&#xff1a;应用程序直接与数据库打交道…

深入C++继承:面向对象编程的核心概念

C是一种功能强大的编程语言&#xff0c;支持面向对象编程&#xff08;OOP&#xff09;范式。在面向对象编程中&#xff0c;继承是一种重要的概念&#xff0c;它使得我们能够创建具有层次结构的类&#xff0c;并实现代码的重用和扩展。本文将深入探讨C中的继承机制&#xff0c;介…

[C#]C# OpenVINO部署yolov8-pose姿态估计模型

【源码地址】 github地址&#xff1a;https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-Pose算法是一种基于深度神经网络的目标检测算法&#xff0c;用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块&#xff0c;通过联合检测和姿势…

屏幕截图--Snagit

Snagit是一款优秀的屏幕、文本和视频捕获、编辑与转换软件。它不仅可以捕获静止的图像&#xff0c;还能获得动态的图像和声音。软件界面干净清爽&#xff0c;功能板块一目了然&#xff0c;为用户提供专业的屏幕录制方案。可以根据自己的需求调整录制视频的分辨率、帧数、输出格…

Linux学习记录——삼십유 传输层TCP协议(1)

文章目录 1、TCP协议报文1、报头和有效载荷的分离2、TCP可靠性3、序号和确认序号4、16位窗口大小5、6个标志位和紧急指针 2、TCP可靠性1、应答机制2、超时重传机制3、连接管理机制握手挥手 3、流量控制 1、TCP协议报文 UDP属于TCP/IP协议族。 1、报头和有效载荷的分离 从头…

邮件群发怎么做才有效果?如何做邮件群发?

邮件群发的注意事项有哪些&#xff1f;QQ邮箱群发邮件的方法&#xff1f; 在当今的数字营销时代&#xff0c;邮件群发已成为企业与客户保持联系的重要手段。但如何确保邮件群发的效果最大化呢&#xff1f;下面&#xff0c;蜂邮EDM将探讨几个关键要素&#xff0c;帮助您更有效地…

HackTheBox - Medium - Linux - Ambassador

Ambassador Ambassador 是一台中等难度的 Linux 机器&#xff0c;用于解决硬编码的明文凭据留在旧版本代码中的问题。首先&#xff0c;“Grafana”CVE &#xff08;“CVE-2021-43798”&#xff09; 用于读取目标上的任意文件。在研究了服务的常见配置方式后&#xff0c;将在其…

阿里云服务器在哪个城市?云服务器地域节点分布表

2024年阿里云服务器地域分布表&#xff0c;地域指数据中心所在的地理区域&#xff0c;通常按照数据中心所在的城市划分&#xff0c;例如华北2&#xff08;北京&#xff09;地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…