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

SQL注入攻击的方法与预防

一、SQL注入概述

SQL 注入SQL Injection)是一种常见且危险的 Web 应用程序安全漏洞,攻击者通过在用户输入中注入恶意 SQL 代码,从而操纵后端数据库执行。

这种攻击可能会导致数据泄露、数据篡改、权限提升甚至整个数据库的破坏。

二、SQL 注入的工作原理

SQL 注入的核心原理是"数据与代码的混淆"。

当应用程序将用户输入直接拼接到 SQL 查询中而没有适当处理时,攻击者可以插入特殊的 SQL 语法,改变原始查询的意图。

例如:

-- 原始查询
SELECT * FROM users WHERE username = 'user_input'-- 攻击者输入: admin' --
-- 最终查询
SELECT * FROM users WHERE username = 'admin' -- '

三、SQL注入的常见攻击方法

1. 基于联合查询的注入

使用 UNION 操作符将恶意查询附加到原始查询上,获取其他表的数据。

-- 原始查询
SELECT name, email FROM users WHERE id = user_input-- 攻击者输入: 1 UNION SELECT username, password FROM admin_users

2. 布尔盲注

攻击者通过真/假条件判断来推断数据库类型和版本信息

-- 判断数据库类型
' AND 1=CONVERT(int, @@version) --

3. 时间盲注

通过条件语句和延时函数判断条件真假。

-- 如果响应延迟5秒 → 数据库名的第一个字符是'a'
' AND IF(SUBSTRING(database(),1,1)='a', SLEEP(5), 0) --

4. 堆叠查询注入

执行多个 SQL 语句,实现更复杂的攻击。

-- 攻击者输入: 1; DROP TABLE users --

通过以上的注入手段,我们发现这种通过把外部传入的参数直接拼接成 SQL 的方式非常危险!

四、SQL 注入的预防措施

1. 使用参数化查询(预编译语句)

PreparedStatement 的 SQL 语句是固定的,不是直接拼出来的方式,而是将外界传进来的条件当作参数 set 进去,这样就避免了 SQL 注入的风险。
Java JDBC 示例:

```sql
String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
ResultSet rs = stmt.executeQuery();
```

MyBatis 示例:

<!-- 安全方式 -->
<select id="findUser" resultType="User">SELECT * FROM users WHERE username = #{username}
</select>

2. 使用ORM框架

现代 ORM 框架(如Hibernate、JPA)通常内置了 SQL 注入防护。

// JPA示例
@Query("SELECT u FROM User u WHERE u.username = :username")
User findByUsername(@Param("username") String username);

3. 输入验证与过滤

  • 白名单验证:只允许特定格式的输入(如邮箱、电话号码)
  • 黑名单过滤:过滤特殊字符(如单引号、分号)

4. 最小权限原则

数据库用户应仅具有必要的最小权限,避免使用 root 或 sa 账户连接数据库。

五、MyBatis中安全使用动态SQL

大家都知道 MyBatics 有两种占位符:${}#{}
但是我们应该避免在 MyBatis 中使用 ${} 进行字符串替换,可能会引发 SQL 注入风险。

而使用 #{} 可以避免 SQL 注入,原因其实就是 #{} 的底层就是预编译语句 PreparedStatement 。

如下所示:

<select id="findUsers" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="ids != null">AND id IN<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach></if></where>
</select>

六、总结

通过采用预编译语句、ORM 框架、输入验证与过滤和最小权限原则等防御措施,可以有效地防止这类攻击。

所以我们开发人员应当始终对用户的输入保持警惕,遵循安全的编码规范,定期进行安全测试和代码审计,以确保应用程序的安全性。

http://www.xdnf.cn/news/10385.html

相关文章:

  • 神经网络-Day42
  • 量化面试绿皮书:1. 海盗分金博弈
  • 【C/C++】面试常考题目
  • (面试)获取View宽高的几种方式
  • vim 的基本使用
  • 华为深度学习面试手撕题:手写nn.Conv2d()函数
  • C++: STL简介与string类核心技术解析及其模拟实现
  • vue3动态路由的实现以及目录权限的设置
  • Eclipse 修改字符集
  • [Godot] 如何导出安卓 APK 并在手机上调试
  • 【金融基础学习】债券市场与债券价值分析
  • ck-editor5的研究 (3):初步使用 CKEditor5 的事件系统和API
  • Mac电脑上本地安装 MySQL并配置开启自启完整流程
  • 历史数据分析——广州港
  • 计算机网络(5)——数据链路层
  • 【数据结构】图的存储(十字链表)
  • 微调大模型:什么时候该做,什么时候不该做?
  • 鸿蒙OS基于UniApp的WebRTC视频会议系统实践:从0到1的HarmonyOS适配之路#三方框架 #Uniapp
  • 【火山引擎 大模型批量处理数据教程-详细】
  • 基于千帆大模型的AI体检报告解读系统实战:使用OSS与PDFBox实现PDF内容识别
  • WEBSTORM前端 —— 第3章:移动 Web —— 第3节:移动适配
  • Rust 学习笔记:发布一个 crate 到 crates.io
  • Python 序列的修改、散列和切 片(Vector类第5版:格式化)
  • qwen3解读
  • Java BigInteger类详解与应用
  • C语言之编译器集合
  • 蓝桥杯java2021年十二届国赛大学A组真题答案整理
  • 基于Sqoop的MySQL-Hive全量/增量同步解决方案(支持多表批量处理
  • 设计模式——单例设计模式(创建型)
  • 131. 分割回文串-两种回溯思路