news 2026/4/15 13:16:08

SQL注入原理和防范措施

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL注入原理和防范措施

SQL注入

含义:是一种常见的网咯攻击手段,攻击者通过在输入字段或者请求中注入恶意的SQL语句,操控数据库执行目的以外的操作:
1.窃取敏感信息;

2.绕过身份验证;

3.修改/删除数据库内容;

4.执行系统命令等

工作原理:


1.输入验证不足:在web程序中没有对用户的输入进行正确的验证,用户可以在该输入字段中插入SQL代码;

2.SQL语句拼接:程序后端将用户的输入与SQL查询拼接在一起,形成完整的数据库查询语句;

3.执行恶意SQL:程序没有对输入进行过滤,清理或者转义,恶意SQL语句将被数据库服务器执行;

4.数据库泄露或者破坏:攻击者可以利用存在的SQL注入漏洞进行查询、修改或删除数据库中的数据,或是执行数据库管理的系统命令

常见SQL注入:

SQL语句:SELECT * FROM users WHERE username = 'user1' AND password = 'password1';


1.“--”:

注释符,将其后面的SQL语句注释掉

输入:
user:aaa'--

Passwd:任意

SELECT * FROM users WHERE username = 'aaa'--' AND password = 'password1';

2.字符型注入' or '1'='1,数字型注入or 1=1:

1=1恒为真,可以绕过验证

SELECT * FROM users WHERE username = 'aaa'or'1'='1' AND password = 'password1';

3.union联合查询:

'UNION SELECT null,username,password FROMusers --

SELECT * FROM users WHERE username = ''UNION SELECT null,username,password FROMusers --' AND password = 'password1';

将会以users表的username和password作为数据结果返回

4.盲注:

无法直接获取查询结果,攻击者通过判断返回页面的响应(如布尔值或时间延迟)来逐步推测数据。

布尔型盲注:

SELECT * FROM users WHERE username = '' AND (SELECT 1 WHERE SUBSTRING((SELECT database()), 1, 1)='t') --';

Select database():尝试获取当前数据库名称

Substring( ,1,1)=’t’:判断数据库名称第一个字符是否为’t’

根据返回判断数据库名称首字母是否为t

时间盲注:

SELECT * FROM users WHERE username = '' AND IF(1=1, SLEEP(5), 0) --';

Sleep()用于延迟语句的执行时间

1=1恒成立,执行sleep(5)延迟语句5秒执行

不成立则立即执行(0)

5.堆叠查询注入:

允许多条SQL语句同时执行

SELECT * FROM users WHERE username = ''; DROP TABLE users; --';

原查询(SELECT * FROM users WHERE username = '')执行后,会继续执行恶意语句,最终导致users表被删除。

6.存储过程注入:

利用存储过程的输入参数注入恶意 SQL

EXEC LoginProcedure 'username', ''; EXEC xp_cmdshell('dir'); --'

利用存储过程(Login Procedure)的输入参数,拼接恶意SQL语句,通过;分隔,执行EXEC xp_cmdshell('dir')xp_cmdshell()可调用系统命令,dir列出目录

7.Cookie注入:

修改浏览器的cookie值进行注入

Cookie: session_id=' OR '1'='1;

若拼接到SQL语句中,恶意cookie被解析后,SQL条件恒成立,可能导致未被授权访问、数据泄露等风险

危害

1.数据泄露: 攻击者获取数据库中的用户名、密码、银行卡号等敏感信息。

2.权限提升: 攻击者可能通过注入命令获得更高的访问权限。

3.数据篡改: 数据库内容被修改或删除。

4.服务中断: 恶意 SQL 代码可能导致数据库崩溃,影响系统可用性。

5.执行系统命令: 通过数据库扩展功能,攻击者可能直接操作操作系统

防范措施

SQL语句:SELECT * FROM users WHERE username = 'user1' AND password = 'password1';

1.参数化查询和预编译

核心原理

问题根源:普通的字符串拼接 SQL 语句会将用户输入直接解析为 SQL 代码,极易引发 SQL 注入攻击。

解决方案:参数化查询将 SQL 语句的结构与用户输入的数据完全分离。数据库会先预编译 SQL 模板,再安全地代入参数,从而彻底避免注入风险。

代码示例解析

java代码:

String sql = "SELECT * FROM users WHERE username = ? AND password = ?";

PreparedStatement pstmt = connection.prepareStatement(sql);

pstmt.setString(1, username);

pstmt.setString(2, password);

ResultSet rs = pstmt.executeQuery();

? 是占位符,代表后续要传入的参数。

PreparedStatement 会预先编译 SQL 模板,确保参数仅作为数据处理,不会被解析为 SQL 命令。

这种方式不仅更安全,还能通过重复使用预编译的语句提升执行效率。

Node.js (MySQL 模块) 实现

const query = "SELECT * FROM users WHERE username = ? AND password = ?";

connection.query(query, [username, password], (err, results) => {

if (err) throw err;

// Handle results

});

Node.js 的 MySQL 模块同样支持占位符语法。

参数通过数组形式传入,驱动会自动完成转义和安全注入,避免了手动拼接字符串的风险。

2.使用ORM框架

核心原理

ORM 框架会将编程语言中的对象与数据库表进行映射,自动生成和执行 SQL 语句。

它完全替代了手动拼接 SQL 的过程,从根源上减少了 SQL 注入的风险。

开发者只需操作对象,无需编写复杂的 SQL,大幅提升了开发效率。

javascript

// 使用 Sequelize

const user = await User.findOne({

where: { username: 'admin', password: 'password123' }

});

框架:代码中使用的是 Node.js 生态里的 Sequelize ORM。

逻辑:User.findOne() 方法会根据传入的条件对象,自动生成安全的SELECT查询语句。

安全性:框架内部会自动对where中的参数进行参数化处理,确保用户输入(即使是恶意输入)只会被当作数据,不会被解析为 SQL 命令

3.输入验证

核心原理

提前拦截:在用户输入到达数据库层之前,就对其格式、长度、内容进行检查,拒绝不符合规则的输入。

白名单原则:只允许已知的、安全的字符或格式通过,而非试图去过滤所有可能的恶意字符(黑名单)。

转义特殊字符:对于必须保留的特殊字符,进行转义处理,使其失去在 SQL 中的特殊含义。

代码示例解析

javascript

const username = req.body.username.replace(/[^a-zA-Z0-9]/g, ''); // 清理特殊字符

正则表达式:/[^a-zA-Z0-9]/g 是一个 “否定” 字符类,匹配所有不是大小写字母或数字的字符。

作用:.replace() 方法会将所有匹配到的特殊字符替换为空字符串,从而彻底清除用户名中的潜在危险字符。

适用场景:适合对用户名、ID 等格式要求简单的字段进行清洗。

4.限制数据库权限

核心原理

最小权限原则:确保每个数据库用户只能执行其工作所需的最基本操作,绝不多赋予任何额外权限。

权限隔离:将不同操作(如读、写、管理)分配给不同的用户账号,避免一个账号泄露导致全库失控。

纵深防御:即使应用层被突破,攻击者也只能在被限制的权限内活动,无法执行DROP、ALTER等高风险操作。

代码示例解析

sql

-- 创建一个新的数据库用户

CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'secure_password';

-- 授予该用户对指定数据库所有表的只读权限

GRANT SELECT ON database_name.* TO 'readonly_user'@'%';

CREATE USER:创建一个名为readonly_user的新用户,@'%'表示该用户可以从任何 IP 地址连接。

GRANT SELECT:仅授予该用户执行SELECT查询的权限,确保它只能读取数据,无法修改或删除数据。

database_name.*:将权限作用于database_name数据库下的所有表。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 4:20:19

Linux 下驱动的编写与测试

一、驱动编写// kernel_protect.c - 最简版本 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h>static int __init protect_init(void) {printk(KERN_INFO "myapp_protect: 模块加载成功\n");return 0; }static void…

作者头像 李华
网站建设 2026/4/11 3:27:01

ThinkLink 基于 RPC 的 LoRaWAN 告警通知机制

在大规模物联网系统中&#xff0c;告警能力是保障系统稳定运行的关键组成部分&#xff0c;尤其是在 LoRaWAN 等低功耗广域网络场景下&#xff0c;设备通常分散部署、长期无人值守。ThinkLink 平台基于原生 RPC 机制与触发联动模型&#xff0c;构建了一套灵活、可扩展的告警通知…

作者头像 李华
网站建设 2026/4/9 21:31:44

WT2606B屏幕驱动芯片集成语音播报和蓝牙功能在教具上的应用方案

WT2606B屏幕驱动芯片集成语音播报和蓝牙功能在教具上的应用方案在正式介绍WT2606B之前&#xff0c;我们不妨先想想&#xff1a;什么样的教具才算真正"智能"?是能显示内容就够了吗?显然不是。真正的智能教具&#xff0c;应该像一个随身携带的小老师——不仅能清晰地…

作者头像 李华
网站建设 2026/4/10 7:07:37

springboot基于Java的诊所管理系统设计实现

背景分析 医疗行业信息化需求日益增长&#xff0c;传统纸质记录和手工管理方式效率低下&#xff0c;易出错。诊所作为基层医疗机构&#xff0c;亟需通过数字化系统优化患者管理、药品库存、财务统计等核心业务流程。Java技术栈凭借稳定性、跨平台性及丰富的生态&#xff0c;成…

作者头像 李华
网站建设 2026/4/15 8:09:17

AI Agent:2026年AI生态核心,架构、A2A协议与MCP全解析(建议收藏)

文章详细介绍了AI Agent作为2026年AI生态核心的概念、架构及其关键技术组件。解析了A2A协议使不同Agent协作&#xff0c;MCP标准化协议统一工具调用&#xff0c;以及Agent Skills模块化能力的设计。这些技术共同构成了AI Agent的基础设施&#xff0c;使其能像人类一样自主决策和…

作者头像 李华
网站建设 2026/4/10 0:19:30

智谱×昇腾×昇思:自主创新算力赋能,多模态SOTA模型再迎新突破

在AI核心技术从“专用工具”向“通用智能伙伴”跨越的今天&#xff0c;全球算力升级正在支撑百万级Token的长上下文处理&#xff0c;并通过整合文本、图像、音频、视频及3D点云等多源数据&#xff0c;推动人机交互向“所见即所得”的多模态交互演进。 继谷歌发布Nano Banana Pr…

作者头像 李华