SQL注入原理及PreparedStatement的使用

Java JDBC中SQL注入攻击原理与PreparedStatement防御实践 SQL注入是一种常见且危害极大的Web安全漏洞,其核心原理在于攻击者通过构造恶意输入,将用户数据作为代码指令注入到SQL查询中,从而改变原有查询逻辑。这种攻击利用了应用程序对用户输入未充分验证和过滤的缺陷,在数据库层面执行非预期的操作。从技术价值看,防范SQL注入是保障数据完整性、保密性和系统可用性的基础,也是安全开发生命周期(SDLC)的关键环节。在应用场景上,无论是用户登录、数据查询还是动态内容展示,任何涉及数据库交互的Web应用都可能面临此类风险。本文以Java JDBC为切入点,通过模拟攻击过程,深 阅读详情

SQL注射原理

SQL 注射能使攻击者绕过认证机制,完全控制远程服务器上的数据库。SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用 SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一 起的。如果开发人员不细心的话,用户数据就有可能被解释成命令,这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。
登陆验证
现 在以一个需要用户身份认证的简单的Web应用程序为例进行讲解。假定这个应用程序提供一个登录页面,要求用户输入用户名和口令。用户通过HTTP请求发送 他们的用户名和口令,之后,Web应用程序检查用户传递来用户名和口令跟数据库中的用户名和口令是否匹配。这种情况下,会要求在SQL数据库中使用一个数 据库表。
对一个用户进行认证,实际上就是将用户的输入即用户名和口令跟表中的各行进行比较,如果跟某行中的用户名和口令跟用户的输入完全匹配,那么该用户就会通过认证。
假如后台的sql语句时这样拼接的
select id from test where username='"+myname+"' and password='"+mypasswd+"' ";
表面上看,如果用户名和口令对匹配,那么该用户通过认证;否则,该用户不会通过认证——但是,事实果真如此吗?非也!读者也许已经注意到了,这里并没有对SQL命令进行设防,所以攻击者完全能够在用户名或者口令字段中注入SQL语句,从而改变SQL查询 。为此,我们仔细研究一下上面的SQL查询字符串:
上述代码认为字符串username和password都是数据,不过,攻击者却可以随心所欲地输入任何字符 。如果一位攻击者输入的用户名为
’OR1=1—
而口令为
x
双划符号--告诉SQL解析器,右边的东西全部是注释,所以不必理会。这样,查询字符串相当于:
select id from test where username='' or 1=1;
如 今的SELECT语句跟以前的已经大相径庭了,因为现在只要用户名为长度为零的字符串''或1=1这两个条件中一个为真,就返回用户标识符ID——我们知 道,1=1是恒为真的。所以这个语句将返回user_table中的所有ID。在此种情况下,攻击者在username字段放入的是SQL指令 'OR1=1--而非数据。
更为严重的情况是当username对应的是'OR1=1;DROPTABLEuser_table;--
数据库中执行的sql语句就变成了:
select id from test where username='' or 1=1;drop table test
这个语句将执行句法上完全正确的SELECT语句,并利用drop命令清空test表。
应对策略
问题的关键就是不要用string构造sql语句,这样就不会利用输入的参数构造sql语句了。所以要用PreparedStatement替换Statement,即用占位符作为实参定义sql语句,从而避免sql注入攻击。
不管什么框架,还是纯JDBC,只用Preparedstatement,一定要用占位符作为实参来构造sql(或hql)语句。

String sql= "select * from test where usernmae=? and password=? " ;
PreparedStatement psm=conn.preparedStatement(sql);
psm.setString(1,myname);
psm.setString(2,mypasswd);
Result rs=psm.executeQuery();

if (rs.next){
rs.close();
con.close();
return false ;
}
else {
rs.close();
con.close();
return true ;
}

AniME框架深度体验:用AI自动生成《修真小说》动画全流程记录 本文详细记录了使用开源多智能体框架AniME,结合其核心动画生成模型AniSora V3,将一段修真小说文本自动转化为风格统一动画视频的全流程实战。文章深入解析了从环境搭建、导演智能体任务分解,到多智能体协作生成分镜、角色、动画及最终合成的每一步操作与挑战,为AI驱动的长视频创作提供了宝贵的实践经验与流程优化思路。 阅读详情

相关推荐

告别功能限制:Win11家庭版无损升级专业版全攻略

本文详细介绍了如何将Win11家庭版无损升级到专业版的全过程,包括升级前的准备、两种官方升级方案(Microsoft Store购买和使用产品密钥)以及命令行升级方法。升级后可解锁远程桌面、组策略编辑器和BitLocker加密等高级功能,适合需要更多商业功能的用户。

weixin_32822843的博客 702

sql注射(MySQL)

SQL Injection Tutorial by Marezzi (MySQL) In this tutorial i will describe how sql injection works and how to use it to get some useful information. First of all: What is SQL injection? It’s one of th...

Coisini的博客 383

速腾Helios-16P使用Lego-loam实时构建点云地图(二)——Lego-loam的编译与运行

不兼容的问题,打开lego-loam的~/lego-loam_ws/src/LeGO-LOAM/LeGO-LOAM/src下的4个源码文件,搜索/camera_init,将所有/camera_init改成camera_init,也就是去掉斜杠,这样再回到工作空间重新编译lego-loam。3、速腾16线激光雷达RS-16 ----- 3D建图算法LeGO-LOAM的使用(Ubuntu18.04 + ROS Melodic)_速腾16线 lego loam_杰尼君的博客-优快云博客。

qq_59475883的博客 2567

【Java开发300个实用技巧】281.SQL注入PreparedStatement

本文深入探讨了SQL注入的防御机制,重点介绍了PreparedStatement在Java开发中的应用。通过分析SQL注入的原理和危害,文章强调了使用参数化查询的重要性,并提供了具体的代码示例和最佳实践。此外,文章还指出了开发中常见的误区,如动态表名和IN语句的错误用法,并给出了正确的解决方案。最后,通过实战案例展示了如何将存在漏洞的代码加固为安全的实现。文章总结道,SQL注入防御是开发者的必备技能,严谨的编码习惯和正确的防御措施是保障系统安全的关键。

1124

【即插即用模块】注意力篇 | TGRS 2025 | SCPP:独家复现!三特征多尺度注意力融合,涨点必备!

摘要:SCPP(Scale-aware Pyramid Pooling)是一种创新的多尺度特征融合模块,专为U型网络瓶颈设计。它通过局部特征提取(1×1卷积)、多尺度膨胀卷积(1/3/5膨胀率分支)和全局特征聚合(全局平均池化)三重结构,结合SE通道注意力机制和自适应加权融合,显著提升特征表达能力。实验表明,SCPP能有效解决边缘模糊和错误检测问题,在遥感图像分割等任务中表现优异。该模块支持即插即用,适用于各类需要多尺度特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 944

结构光之相移法+多频外差的数学原理推导

‍论文:基于数字光栅投影的结构光三维测量技术与系统研究 [博]作者:李中伟 华中科技大学 2007功能:相移法:多频外差(三频N步相移法)01 相移法图1 待写入投影仪的理想N步相移条纹通常对于 步相移来说,生成第 幅条纹图像(如图1所示)的公式如下:402 Payment Required其中::背景光强:调制强度:像素点横向坐标:相移值图2 相机拍摄到的实际 N ......

3D视觉工坊 1188

用java PreparedStatement就不用担心sql注入了吗?

     先感慨下,好久没写博客了,一是工作太忙,二是身体不太给力,好在终于查清病因了,趁着今天闲下来,迫不及待与读者交流,最后忠告一句:身体是活着的本钱!      言归正传,对java有了解的同学基本上都体验过JDBC,基本都了解PreparedStatement,PreparedStatement相比Statement基本解决了SQL注入问题,而且效率也有一定提升。      关于Pre...

weixin_33757911的博客 1300

深入浅出之ADown降采样模块(YOLO)

YOLOv9中的ADown模块是一种用于目标检测任务中的下采样操作的卷积块。在深度学习模型中,下采样(downsampling)是减少特征图空间维度的常用技术,它有助于模型在更高层次上捕捉图像的特征,同时减少计算量。ADown模块的设计旨在以一种高效且对性能影响较小的方式进行这一操作。

浩瀚之水的专栏 4173

SQL注射总结(1)

Sql注射总结(早源于or1=1)   最重要的表名:select * from sysobjectssysobjects ncsysobjectssysindexes tsysindexessyscolumnssystypessysuserssysdatabasessysxloginssysprocesses  最重要的一些用户名(默认sql数据库中存在着的)publicdboguest

净心编程 1293

半车(前后、左右)、整车悬架详细推导建模和simulink仿真分析

用达朗贝尔定理依据悬架数学模型,得到悬架模型微分方程,分别用simulink建立前后半车、左右半车悬架;结合转向2自由度模型与半车侧倾模型,对模型考虑相干性、延时性的C级随机路面下,仿真分析给定角阶跃输入下的侧倾稳定性。

Mr.邹的博客 1万+

IEC 61850标准协议解读 3.MMS服务

摘要:本文系统介绍了MMS(制造报文规范)的基础知识及其在IEC61850中的应用。首先解析MMS的核心定义、通信流程(带确认/不带确认服务)、虚拟制造设备(VMD)概念及核心对象(域/有名变量等)。重点阐述IEC61850与MMS的映射关系,包括对象分层映射、服务转换规则及数据类型对应。深入分析ASN.1编解码机制,说明MMS PDU的分层结构与解码流程。最后通过典型报文案例(报告服务、控制服务、文件传输等)和通信初始化流程,展示MMS在智能变电站中的实际应用。全文揭示了MMS作为抽象应用层协议如何通过标

张二狗的博客 724

JDBC PreparedStatement 防止sql注入原理

JDBC PreparedStatement 防止sql注入原理 使用Statement执行查询语句的时候 : 比如要执行用户名 密码登录验证的sql语句 经常要输入 String sql = " select * from user where name=' " +name+ " ' and pwd = ' " +pwd+ " ' "; 这时候如果用户输入的密码...

qq_42121746的博客 714

C#函数返回多个值实现实例

本文实例讲解C#函数返回多个值多种实现方法。

qq_30725967的博客 1170

Java面试-SQL 注入原理与 PreparedStatement 防范

《SQL注入原理与PreparedStatement防范》摘要: 本文系统剖析SQL注入攻击原理,通过典型登录绕过案例(如' OR '1'='1)演示字符串拼接漏洞如何被利用窃取数据。文章详解PreparedStatement的防御机制——预编译SQL与参数化查询能有效隔离代码与数据,并对比展示了漏洞代码与安全实现的差异。此外还涵盖Union注入、盲注等攻击类型,以及Spring Boot等框架的防护策略,强调安全编码是开发者必须承担的责任。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PreparedStatement防止sql注入原理

PreparedStatement类是java的一个类,准确说是jdbc规范中的一个接口,各个数据库产商的实现不同(即实现类不同),今天我们就以mysql数据库来说,我已经下载了mysql数据库的驱动jar包和驱动程序的源代码. sql注入的时候,比如,有些用户就会在界面上输入anything' OR 'x'='x这种东西,最后sql语句就是如下: SELECT * FROM users WH...

一只苟延残喘的卑微蝼蚁 7005

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

PreparedStatement 防止 SQL 注入原理

前言   PreparedStatement 对象可以防止 SQL 注入,而 Statement 对象不能防止 SQL 注入,接下来使用一个案例剖析原理。 原理 使用如下代码模拟 SQL 注入 总结   由最终执行的 SQL 可以看出,PreparedStatement 防止 SQL 注入的原理就是把用户非法输入的单引号进行转义,最终传入参数作为一个整体执行,从而防止 SQL 注入,而 Statement 对象不会进行此操作。   PreparedStatement 可以有效防止 SQL 注入,你

Acx7的博客 2979

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

PreparedStatement防止sql注入的原理

1. PreparedStatement 与 Statement 是用来干什么的? PreparedStatement 和Statement 都可以对sql语句进行编译并返回编译后的标识。 2. PreparedStatement 的优点? 1. 有效防止sql注入。 2. 预编译,比statement执行效率高(一次编译多次执行) 3. 使用参数设置可读性好。 3. 什么是sql注入? 用户在前端页面用输入恶意的sql语句,欺骗服务器执行恶意的sql代码,导致数据库泄漏,这就是sql注入。例

蔡里都傻的博客 800

preparedStatement防注入sql原理

作为一个IT业内人士只要接触过数据库的人都应该知道sql注入的概念及危害,那么什么叫sql注入呢?我在这边先给它来一个简单的定义:sql注入,简单来说就是用户在前端web页面输入恶意的sql语句用来欺骗后端服务器去执行恶意的sql代码,从而导致数据库数据泄露或者遭受攻击。 那么,当我们在使用数据库时,如何去防止sql注入的发生呢?我们自然而然地就会想到在用JDBC进行连接时使用PreparedSt...

xy2981的博客 319

PreparedStatement能防止sql注入的原理

Class.forName(com.mysql.jdbc.Driver); Connection con = DriverManager.getConnection("jdbc:mysql://...."); Statement st = con.CreateStatement(); String id = "03"; String sq = "delete from table1 where id="+id; st.execute(sq); 上面这段代码的本意是要删除id=03的记录,但是如果有人将id

m0_53328194的博客 1677

JDBC介绍以及使用、PreparedStatement的原理、SQL注入

JDBC就是使用java语言操作关系型数据库的一套API全称:(Java Database Connectivity)java数据库连接。

wocao_666的博客 307

PreparedStatement就不用担心sql注入了吗?PreparedStatement防止sql注入的原理!建议看mysql的jdbc的实现类源码

转载自用java PreparedStatement就不用担心sql注入了吗? 先感慨下,好久没写博客了,一是工作太忙,二是身体不太给力,好在终于查清病因了,趁着今天闲下来,迫不及待与读者交流,最后忠告一句:身体是活着的本钱!      言归正传,对java有了解的同学基本上都体验过JDBC,基本都了解PreparedStatement,PreparedStatement相比Stateme

一只苟延残喘的卑微蝼蚁 3574
上一篇: Spring原理
下一篇: Oracle存储过程详解
北斗安心联
博客等级 码龄16年 6粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值