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

从 JDBC 角度剖析 SQL 注入绕过登录机制

从 JDBC 底层深度剖析 SQL 注入登录绕过原理

前言

在 Java Web 开发与数据库安全学习中,相信很多人都遇到过经典现象:只需在登录输入框填写' or 1=1 --,无需正确账号密码,就能直接闯入系统。

很多人只知道这是 SQL 注入,却不懂底层为什么能绕过、漏洞根源在哪、JDBC 两种语句对象本质区别是什么。本文从业务场景、SQL 语法、JDBC 底层机制、漏洞危害、企业级防护五个维度,系统深度拆解,把原理、成因、防护一次性讲透彻。

一、正常登录业务与 JDBC 执行流程

1. 业务逻辑

网站登录核心原理:接收前端传入的用户名、密码,后端通过 JDBC 拼接查询 SQL,去数据库user表匹配记录。

  • 查到用户记录 → 登录成功
  • 无匹配记录 → 账号密码错误

2. 标准校验 SQL

sql

SELECT * FROM user WHERE username='输入账号' AND password='输入密码';

语法逻辑:必须同时满足用户名相等、密码相等,采用AND逻辑与,两个条件缺一不可。

3. 正常 JDBC 执行思路

前端传参 → 后端接收参数 → 拼接 SQL 语句 → Statement 对象执行 → 解析 ResultSet 结果集 → 判断登录状态。

二、SQL 注入攻击 payload 原理拆解

1. 常用恶意注入语句

只需在用户名输入框填写:

plaintext

' or 1=1 --

密码随意乱填即可。

2. 拼接后被篡改的 SQL

后端采用字符串直接拼接后,最终生成 SQL:

sql

SELECT * FROM user WHERE username='' or 1=1 -- ' AND password='任意密码'

3. 逐字符深度解析

  1. 单引号'原本 SQL 里是username='内容',攻击者输入的单引号提前闭合字符串,直接跳出原有引号结构,破坏原有 SQL 格式。

  2. or 1=1恒真条件SQL 逻辑运算中:

  • AND必须两边都为真才成立
  • OR只要一边为真,整体条件就为真

1=1是永久成立的逻辑表达式,拼接后整个WHERE条件直接永久为真。

  1. --SQL 单行注释符--后面所有内容都会被数据库当作注释忽略,直接删掉后半段AND password='xxx'密码校验逻辑。

4. 等效最终 SQL

篡改后的语句等价于:

sql

SELECT * FROM user WHERE 1=1;

含义:查询 user 表中所有用户数据。后端只要检测到有查询结果,就判定登录成功,完整绕过账号密码验证。

三、漏洞根源:JDBC Statement 设计缺陷

1. 不安全代码示范(漏洞源头)

java

运行

// 获取前端用户输入 String username = request.getParameter("username"); String password = request.getParameter("password"); // 直接字符串拼接 SQL,高危写法 String sql = "SELECT * FROM user WHERE username='" + username + "' AND password='" + password + "'"; // 创建普通 Statement 执行 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql);

2. 漏洞本质

  • Statement执行逻辑:先拼接完整 SQL 字符串,再交给数据库编译执行
  • 开发者把用户输入直接拼入语句,用户输入被当作 SQL 语法的一部分
  • 攻击者可以利用单引号、逻辑运算符、注释符,随意改写原有 SQL 结构与业务逻辑。

3. 延伸危害:不止绕过登录

这种注入漏洞危害远不止登录绕过:

  • 泄露全站所有用户隐私数据;
  • 执行DELETE清空整张数据表;
  • 篡改所有用户密码;
  • 拖库、脱库,造成严重数据安全事故。

四、安全解决方案:PreparedStatement 预编译机制

1. 企业标准安全写法

java

运行

// 使用 ? 作为占位符,不进行任何字符串拼接 String sql = "SELECT * FROM user WHERE username=? AND password=?"; // 创建预编译语句对象 PreparedStatement pstmt = conn.prepareStatement(sql); // 单独给占位符赋值 pstmt.setString(1, username); pstmt.setString(2, password); // 执行查询 ResultSet rs = pstmt.executeQuery();

2. PreparedStatement 防注入底层原理

  1. 先编译,后传参JDBC 会先把带?的 SQL 模板发送给数据库预编译,固定好 SQL 语法结构,后续只能传参数,不能改语句结构。

  2. 参数强制转义所有传入的参数,都会被 JDBC 自动做特殊字符转义,单引号、or--都会被当作普通文本处理。

  3. 语义隔离SQL 语法结构 和 用户输入参数完全隔离:用户无论输入什么恶意字符,都只能作为字段值,无法被数据库解析为 SQL 关键字、逻辑符或注释符。

3. 两种对象核心对比

  • Statement:字符串拼接、后编译、用户输入可篡改 SQL 结构、存在 SQL 注入、性能低;
  • PreparedStatement:预编译模板、占位符传参、语法与参数隔离、彻底防注入、支持 SQL 缓存复用、性能更高。

五、开发规范与多层防护建议

  1. 禁用 Statement企业开发中一律使用PreparedStatement,杜绝手动字符串拼接 SQL。

  2. 前端 + 后端参数校验对输入内容做正则过滤,限制特殊符号:单引号、#、--、or、and 等敏感字符。

  3. 数据库最小权限给业务账号只分配查询、增改权限,不允许删除、修改库结构,即使被注入也降低损失。

  4. 优先使用持久层框架MyBatis、JPA 等框架底层已封装预编译机制,合理使用#{} 占位符可天然规避注入。

六、全文总结

  1. ' or 1=1 --能绕过登录,不是万能密码,是典型 SQL 注入攻击
  2. 漏洞核心成因:采用 JDBC Statement 进行 SQL 字符串拼接,用户输入破坏语句结构;
  3. 注入关键逻辑:单引号闭合语句 +or 1=1构造恒真条件 +--注释绕过后续校验;
  4. 根本防护方案:使用PreparedStatement预编译占位符,实现 SQL 语法与参数隔离,从底层杜绝注入;
  5. 实际项目需配合参数校验、最小权限、框架规范,多层防护保障数据库安全。
http://www.jsqmd.com/news/821743/

相关文章:

  • 终极桌面整理指南:如何用NoFences免费开源工具告别杂乱桌面
  • 啥是RAG 它能干什么?
  • 3步完成笔记迁移:Obsidian Importer让知识整合变得如此简单
  • 无风扇笔记本散热原理与工程实践:静音计算的取舍与优化
  • 3分钟快速搭建QQ机器人:LuckyLilliaBot OneBot框架终极指南
  • 极速上手!OpenClaw 接入 MiniMax 图文指南
  • 第22天:对象的序列化和反序列化
  • 3步解锁Navicat Mac版无限试用期:永久重置工具使用指南
  • 别再瞎调了!手把手教你搞定SD卡和eMMC的Tuning流程(附Linux驱动代码解析)
  • 魔兽世界BBC周年纪念版即将上线!UU远程,让你出门在外也能组队开荒!
  • 保姆级教程:在Qt/C++项目中用QgsAnnotationItem给地图添加自定义标注(文字+SVG/PNG图片)
  • IDA静态分析-使用记录
  • #Python 类(Class)知识点总结
  • 别再搞混了!Web地图开发必懂的EPSG:4326与3857转换(附JavaScript代码)
  • 如何快速使用Bebas Neue:免费开源字体的完整指南
  • 《从王自如到YoooClaw:AI时代的哑铃型商业结构》
  • 别再用暴力循环了!用C++筛法高效分解质因数,附完整代码与时间复杂度分析
  • 手把手教你用Python复现TITAN风暴跟踪算法(附代码与数据)
  • 从零开始:ESP32 Arduino开发环境搭建完整指南
  • 声临其境 安全直达 ——NR2048 赋能矿场高可靠高清语音通信
  • STM32CubeMX配置外部中断后,生成的HAL库代码里AFIO和EXTI都做了啥?
  • Cyber Engine Tweaks终极指南:5步快速解锁赛博朋克2077无限潜能
  • RAG:AI Agent的“开卷考试”秘籍,让你的问题回答不再“瞎编”!
  • 从二叉树到UML:Graphviz的DOT语言保姆级语法手册(附避坑指南)
  • 2026年幻视AI数字工牌与全域零售AI解决方案官方指南
  • 如何轻松将Axure RP界面切换为中文:3个实用技巧让设计更高效
  • 2026最新测评:熬夜亲测5款硬核工具,教你高效降低AI率! - 降AI实验室
  • 基于Spartan-3 FPGA的PCIe单通道DMA传输性能实测与优化
  • 使用 Taotoken CLI 工具一键配置多开发环境接入信息
  • 092、Python在芯片验证中的应用:从脚本小子到验证架构师