当前位置: 首页 > news >正文

Java项目防止SQL注入的几种方案

目录

一、什么是SQL注入?

二、Java项目防止SQL注入方式

1、PreparedStatement防止SQL注入

2、mybatis中#{}防止SQL注入

3、对请求参数的敏感词汇进行过滤

4、nginx反向代理防止SQL注入 


一、什么是SQL注入?

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

SQL案列:

String sql = "delete from table1 where id = " + "id";

这个id从请求参数中获取,若参数被拼接为:

"1001 or  1 = 1"

最执行语句变为:

String sql = "delete from table1 where id = 1001 or 1 = 1";

此时,数据库的数据都会被清空掉,后果非常严重


二、Java项目防止SQL注入方式

这里总结4种:

  • PreparedStatement防止SQL注入
  • mybatis中#{}防止SQL注入
  • 对请求参数的敏感词汇进行过滤
  • nginx反向代理防止SQL注入

1、PreparedStatement防止SQL注入

PreparedStatement具有预编译功能,以上述SQL为例

使用PreparedStatement预编译后的SQL为:

delete from table1 where id= ?

此时SQL语句结构已固定,无论"?"被替换为任何参数,SQL语句只认为where后面只有一个条件,当再传入 1001 or  1 = 1时,语句会报错,从而达到防止SQL注入效果。

2、mybatis中#{}防止SQL注入

mybatis中#{}表达式防止SQL注入与PreparedStatement类似,都是对SQL语句进行预编译处理

PS 注意

#{} :参数占位符

${} :拼接替换符,不能防止SQL注入,一般用于:

  • 传入数据库对象(如:数据库名称、表名)
  • order by  后的条件

3、对请求参数的敏感词汇进行过滤

这里是springboot的写法,如下:

import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.Enumeration;/*** @Auther: admin* @Description: sql防注入过滤器*/
@WebFilter(urlPatterns = "/*",filterName = "sqlFilter")
@Configuration
public class SqlFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}/*** @description sql注入过滤*/@Overridepublic 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)) {//TODO 这里直接抛异常处理,前后端交互项目中,请把错误信息按前后端"数据返回的VO"对象进行封装throw new IOException("您发送请求中的参数中含有非法字符");} else {filterChain.doFilter(request,response);}}/*** @description 匹配效验*/protected static boolean sqlValidate(String str){// 统一转为小写String s = str.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;}@Overridepublic void destroy() {}
}

4、nginx反向代理防止SQL注入 

越来越多网站使用nginx进行反向代理,该层我们也可以进行防止SQL注入配置。

将下面的Nginx配置文件代码放入到server块中,然后重启Nginx即可。

 if ($request_method !~* GET|POST) { return 444; }#使用444错误代码可以更加减轻服务器负载压力。#防止SQL注入if ($query_string ~* (\$|'|--|[+|(%20)]union[+|(%20)]|[+|(%20)]insert[+|(%20)]|[+|(%20)]drop[+|(%20)]|[+|(%20)]truncate[+|(%20)]|[+|(%20)]update[+|(%20)]|[+|(%20)]from[+|(%20)]|[+|(%20)]grant[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]where[+|(%20)]|[+|(%20)]select[+|(%20)]|[+|(%20)]and[+|(%20)]|[+|(%20)]or[+|(%20)]|[+|(%20)]count[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]chr[+|(%20)]|[+|(%20)]mid[+|(%20)]|[+|(%20)]like[+|(%20)]|[+|(%20)]iframe[+|(%20)]|[\<|%3c]script[\>|%3e]|javascript|alert|webscan|dbappsecurity|style|confirm\(|innerhtml|innertext)(.*)$) { return 555; }if ($uri ~* (/~).*) { return 501; }if ($uri ~* (\\x.)) { return 501; }#防止SQL注入 if ($query_string ~* "[;'<>].*") { return 509; }if ($request_uri ~ " ") { return 509; }if ($request_uri ~ (\/\.+)) { return 509; }if ($request_uri ~ (\.+\/)) { return 509; }#if ($uri ~* (insert|select|delete|update|count|master|truncate|declare|exec|\*|\')(.*)$ ) { return 503; }#防止SQL注入if ($request_uri ~* "(cost\()|(concat\()") { return 504; }if ($request_uri ~* "[+|(%20)]union[+|(%20)]") { return 504; }if ($request_uri ~* "[+|(%20)]and[+|(%20)]") { return 504; }if ($request_uri ~* "[+|(%20)]select[+|(%20)]") { return 504; }if ($request_uri ~* "[+|(%20)]or[+|(%20)]") { return 504; }if ($request_uri ~* "[+|(%20)]delete[+|(%20)]") { return 504; }if ($request_uri ~* "[+|(%20)]update[+|(%20)]") { return 504; }if ($request_uri ~* "[+|(%20)]insert[+|(%20)]") { return 504; }if ($query_string ~ "(<|%3C).*script.*(>|%3E)") { return 505; }if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") { return 505; }if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") { return 505; }if ($query_string ~ "proc/self/environ") { return 505; }if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") { return 505; }if ($query_string ~ "base64_(en|de)code\(.*\)") { return 505; }if ($query_string ~ "[a-zA-Z0-9_]=http://") { return 506; }if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") { return 506; }if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { return 506; }if ($query_string ~ "b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)b") { return 507; }if ($query_string ~ "b(erections|hoodia|huronriveracres|impotence|levitra|libido)b") {return 507; }if ($query_string ~ "b(ambien|bluespill|cialis|cocaine|ejaculation|erectile)b") { return 507; }if ($query_string ~ "b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)b") { return 507; }#这里大家根据自己情况添加删减上述判断参数,cURL、wget这类的屏蔽有点儿极端了,但要“宁可错杀一千,不可放过一个”。if ($http_user_agent ~* YisouSpider|ApacheBench|WebBench|Jmeter|JoeDog|Havij|GetRight|TurnitinBot|GrabNet|masscan|mail2000|github|wget|curl|Java|python) { return 508; }#同上,大家根据自己站点实际情况来添加删减下面的屏蔽拦截参数。if ($http_user_agent ~* "Go-Ahead-Got-It") { return 508; }if ($http_user_agent ~* "GetWeb!") { return 508; }if ($http_user_agent ~* "Go!Zilla") { return 508; }if ($http_user_agent ~* "Download Demon") { return 508; }if ($http_user_agent ~* "Indy Library") { return 508; }if ($http_user_agent ~* "libwww-perl") { return 508; }if ($http_user_agent ~* "Nmap Scripting Engine") { return 508; }if ($http_user_agent ~* "~17ce.com") { return 508; }if ($http_user_agent ~* "WebBench*") { return 508; }if ($http_user_agent ~* "spider") { return 508; } #这个会影响国内某些搜索引擎爬虫,比如:搜狗#拦截各恶意请求的UA,可以通过分析站点日志文件或者waf日志作为参考配置。if ($http_referer ~* 17ce.com) { return 509; }#拦截17ce.com站点测速节点的请求,所以明月一直都说这些测速网站的数据仅供参考不能当真的。if ($http_referer ~* WebBench*") { return 509; }#拦截WebBench或者类似压力测试工具,其他工具只需要更换名称即可。

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。 

相关文章:

Java项目防止SQL注入的几种方案

目录 一、什么是SQL注入&#xff1f; 二、Java项目防止SQL注入方式 1、PreparedStatement防止SQL注入 2、mybatis中#{}防止SQL注入 3、对请求参数的敏感词汇进行过滤 4、nginx反向代理防止SQL注入 一、什么是SQL注入&#xff1f; SQL注入即是指web应用程序对用户输入数…...

Win11 安装安卓子系统方法教程

WIN11安装安卓子系统 准备工作下载安装安装完成使用adb连接子系统结束 准备工作 开启电脑中的 控制面板>>>>程序和功能>>启用或关闭Windows功能>>>找到“Hyper-V”&#xff0c;把勾都勾上&#xff0c;确定&#xff0c;完成安装&#xff0c;并重启电…...

golang pg 数据库不存在 就创建 --chatPGT

问&#xff1a;linkOrCreateDatabase(addr ), 函数执行 连接 pg数据库&#xff0c;若数据库 不存在就创建 gpt: 要在 Go 中连接到 PostgreSQL 数据库并在数据库不存在时创建数据库&#xff0c;你可以使用 github.com/lib/pq 包以及 database/sql 包。以下是一个示例&#xff1…...

VUE3照本宣科——eslint与prettier

VUE3照本宣科——eslint与prettier VUE3照本宣科系列导航 前言一、eslint1.配置文件2.配置规则3.忽略错误 二、prettier三、总结 VUE3照本宣科系列导航 1.VUE3照本宣科——认识VUE3 2.VUE3照本宣科——应用实例API与setup 3.VUE3照本宣科——响应式与生命周期钩子 4.VUE3照本宣…...

【谷粒学院】Maven加载问题

问题 maven加载项目时候&#xff0c;默认不会加载src-java文件夹里面xml类型文件的 解决方案 直接赋值xml文件到target目录通过配置实现 &#xff08;1&#xff09;在pom.xml文件中配置 <!-- 项目打包时会将java目录中的*.xml文件也进行打包 --> <build><re…...

PostgreSQL数据库中实现字段递增

在 PostgreSQL 中&#xff0c;可以使用序列&#xff08;sequence&#xff09;来实现字段的递增。序列是一种特殊的对象&#xff0c;用于生成唯一的递增数字。 首先&#xff0c;您需要创建一个序列对象。可以使用以下命令创建一个名为 "my_sequence" 的序列&#xff…...

深度学习——深度学习计算二

深度学习——深度学习计算二 文章目录 前言三、延后初始化四、自定义层4.1. 不带参数的层4.2. 带参数的层 五、读写文件5.1. 加载和保存张量5.2. 加载和保存模型参数 六、GPU6.1. 计算设备6.2. 张量与GPU6.3. 神经网络与GPU 总结 前言 延续上一章的学习&#xff0c;本章继续记…...

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Badge

可以附加在单个组件上用于信息标记的容器组件。该组件从API Version 7开始支持。 支持单个子组件。子组件类型&#xff1a;系统组件和自定义组件&#xff0c;支持渲染控制类型&#xff08;if/else、ForEach和LazyForEach&#xff09;。 一、接口 方法1&#xff1a; Badge(value…...

在Flink中集成和使用Hudi

本文介绍在Flink 中集成和使用Hudi。介绍Flink如何将Streaming引入Hudi。在Hudi上使用Flink,并学习Flink读写Hudi的不同模式: Flink SQL客户端写入:Flink SQL客户端写入(读取)Hudi。 配置:对于全局配置,通过$FLINK_HOME/conf/FLINK-conf.yaml进行设置。对于每个作业配置…...

docker搭建Jenkins及基本使用

1. 搭建 查询镜像 docker search jenkins下载镜像 docker pull jenkins/jenkins启动容器 #创建文件夹 mkdir -p /home/jenkins_home #权限 chmod 777 /home/jenkins_home #启动Jenkins docker run -d -uroot -p 9095:8080 -p 50000:50000 --name jenkins -v /home/jenkins_home…...

CSS初体验

目录 一、CSS初体验 二、CSS引入方式 三、选择器 3.1 标签选择器 3.2 类选择器 3.3 id选择器 3.4 通配符选择器 四、盒子尺寸和背景色 五、文字控制属性 5.1 字体大小 5.2 字体样式(是否倾斜) 5.3 行高 5.3.1 单行文字垂直居中 5.4 字体族 5.5 font复合属性 5.…...

python性能分析

基于cProfile统计函数级的时延&#xff0c;生成排序列表、火焰图&#xff0c;可以快速定位python代码的耗时瓶颈。参考如下博文结合实操&#xff0c;总结为三步&#xff1a; 使用 cProfile 和火焰图调优 Python 程序性能 - 知乎本来想坐下来写篇 2018 年的总结&#xff0c;仔细…...

苹果手机怎么备份所有数据?2023年iPhone 15数据备份常用的3种方法!

当苹果手机需要进行刷机、恢复出厂设置、降级iOS系统等操作时&#xff0c;我们需要将自己的iPhone数据提前进行备份。 特别是在苹果发布新iOS系统时&#xff0c;总有一些小伙伴因为升降级系统&#xff0c;而导致了重要数据的丢失。 iPhone中储存着重要的照片、通讯录、文件等数…...

【RV1103】如何新增一个新板级配置

文章目录 新建一个板级配置文件 新建一个板级配置文件 我的目标 通过./build.sh lunch 来选择我的板子配置。 在目录sdk/project/cfg目录下新建一个xxxx.mk文件&#xff0c;文件名字格式如下&#xff1a; BoardConfig-"启动介质"-"电源方案"-"硬件…...

ThreeJS-3D教学五-材质

我们在ThreeJS-3D教学二&#xff1a;基础形状展示中有简单介绍过一些常用的材质&#xff0c;这次我们举例来具体看下效果&#xff1a; 代码是这样的&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…...

递归

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;汉诺塔 &#x1f449;&…...

Vercel部署个人静态之DNS污染劫持问题

vercel是我第一次接触静态网站托管所使用的服务&#xff0c;类似的还有github以及Netfily。但是Vercel的自动化构建远比github page方便的多。通过github授权给Vercel就实现了自动拉取构建及发布的一系列流程。在本地推送代码可以使用小乌龟工具&#xff0c;线上代码发布使用Ve…...

Microsoft Defender Vulnerability部署方案

目录 前言 Microsoft Defender Vulnerability 的主要功能 Microsoft Defender Vulnerability部署方案 前言 Microsoft Defender Vulnerability 是微软公司提供的一种安全工具,用于检测和修复系统中的漏洞和弱点。它可以帮助用户保护他们的计算机免受潜在的威胁和攻击,提高…...

云服务器CVM_云主机_云计算服务器_弹性云服务器-腾讯云

腾讯云服务器CVM提供安全可靠的弹性计算服务&#xff0c;腾讯云明星级云服务器&#xff0c;弹性计算实时扩展或缩减计算资源&#xff0c;支持包年包月、按量计费和竞价实例计费模式&#xff0c;CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格&#xff0c;提供9个9的数…...

PLC之间无线通信-不用编程实现多品牌PLC无线通讯的解决方案

本文是PLC设备之间基于IGT-DSER系列智能网关实现WIFI无线通讯的案例。采用西门子S7-1500系列的PLC作为主站&#xff0c;与其它品牌的PLC之间进行网络通讯。案例包括智能网关AP方式、现场WIFI信号两种方式。有线以太网方式实现PLC之间通讯的案例 一、智能网关AP方式 将网络中的其…...

HS2-HF_Patch深度解析:Honey Select 2终极增强补丁实战指南

HS2-HF_Patch深度解析&#xff1a;Honey Select 2终极增强补丁实战指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch是一款专为Honey Select 2游…...

ComfyUI-FramePackWrapper:8GB显存也能流畅生成高质量AI视频的终极方案

ComfyUI-FramePackWrapper&#xff1a;8GB显存也能流畅生成高质量AI视频的终极方案 【免费下载链接】ComfyUI-FramePackWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-FramePackWrapper 你是否曾因显存不足而无法体验AI视频生成的魅力&#xff1f;现在…...

RAG系统安全攻防:从PoisonedRAG看检索增强生成的风险与防御

1. 项目概述&#xff1a;当检索增强生成遭遇“毒药”最近在开源社区里&#xff0c;一个名为“PoisonedRAG”的项目引起了我的注意。这个名字本身就充满了戏剧性——“中毒的RAG”。作为一名长期关注大语言模型应用落地的从业者&#xff0c;我立刻意识到&#xff0c;这绝不是一个…...

从实验室小白到跑通第一个模型:我的DeepLabCut安装踩坑全记录(Windows 11 + RTX 4060)

从实验室小白到跑通第一个模型&#xff1a;我的DeepLabCut安装踩坑全记录&#xff08;Windows 11 RTX 4060&#xff09; 去年刚进实验室时&#xff0c;导师扔给我一篇Nature Methods论文说"试试这个工具"&#xff0c;从此开始了与DeepLabCut的"相爱相杀"。…...

Hermes-Agent 智能体核心能力与实战效能深度评测

在构建自动化工作流或智能客服系统时&#xff0c;开发者最常遇到的痛点往往不是模型本身不够聪明&#xff0c;而是“记不住”和“乱执行”。很多时候&#xff0c;一个智能体在前几轮对话中还逻辑清晰&#xff0c;一旦上下文拉长&#xff0c;就开始遗忘关键约束&#xff0c;或者…...

C# Winform高效分页实践:SunnyUI uiPagination控件详解与数据绑定

1. 初识SunnyUI uiPagination控件 第一次接触SunnyUI的uiPagination控件是在开发一个订单管理系统时。当时客户抱怨系统加载5000多条记录时会卡顿近10秒&#xff0c;我试过各种传统分页方案都不够理想&#xff0c;直到发现了这个宝藏控件。它就像Winform界的"瑞士军刀&quo…...

AI智能体技能栈构建:基于Claw与Hermes框架的模块化实践

1. 项目概述&#xff1a;构建我的AI智能体技能栈最近在折腾AI智能体&#xff08;Agent&#xff09;的开发&#xff0c;特别是围绕Claw和Hermes这两个框架。如果你也对这个领域感兴趣&#xff0c;想打造一个能处理复杂任务、拥有多种技能的智能助手&#xff0c;那么我整理的这个…...

人工智能-现代方法(一)

2026.05.12 这几天开始看《人工智能-现代方法》&#xff0c;做一些知识记录。 1、学习的概念&#xff1a;归纳和演绎。&#xff08;19章&#xff09; 演绎靠逻辑推理&#xff0c;归纳靠经验总结。所以在前提正确的情况下&#xff0c;演绎的结论必然正确。归纳的结论则有可能出现…...

3个战略理由选择ES-Client作为您的Elasticsearch管理平台

3个战略理由选择ES-Client作为您的Elasticsearch管理平台 【免费下载链接】es-client elasticsearch客户端&#xff0c;issue请前往码云&#xff1a;https://gitee.com/qiaoshengda/es-client 项目地址: https://gitcode.com/gh_mirrors/es/es-client 在当今数据驱动的业…...

【DeepSeek安全防护权威指南】:20年攻防专家亲授Prompt注入3大高危场景与7层防御体系

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek Prompt注入防护的演进与现状 随着 DeepSeek 系列大模型在企业级场景中的深度部署&#xff0c;Prompt 注入攻击已从理论威胁演变为高频真实风险。早期防护策略依赖于简单的关键词过滤和长度截断…...