SQL注入的全面学习和了解

SQL注入的全面学习和了解

点击标题下「蓝色微信名」可快速关注

SQL注入很多都由于开发习惯和经验导致的,会给系统运行,带来易被攻击的风险,这需要我们在日常的开发过程中,了解一些SQL合规编写的技能,才能让我们的程序更加地健壮,增长我们的经验。

一、什么是SQL注入?

定义:Web程序数据库层安全漏洞,网络攻击常用方式。

核心原理:利用程序员编码疏忽,在用户输入中注入SQL语句,被数据库服务器误执行。

危害:无账号登录、未授权数据访问、数据库篡改/删除。

二、SQL注入的4大原理

1. 拼接查询:通过分号分隔命令(例:1234;DELETE FROM user)

2. 利用注释执行:插入注释符号屏蔽原有逻辑(例:1'OR SLEEP(500)--)

3. 传入非法参数:未处理特殊字符(例:用户名G'chen导致SQL语法异常)

添加额外条件:插入真值表达式(例:1234 OR TRUE篡改更新范围)

三、典型SQL注入实例

原始SQL

代码语言:javascript复制select * from user table where

username='"+userName+"' and password='"+password+"'非法输入(用户名:''or 1=1 --,密码任意)

代码语言:javascript复制SELECT *FROM user table WHERE username='' or 1=1 -

- and password=‘’危害升级(除数据库)

代码语言:javascript复制SELECT * FROM user table WHERE username='';DROP

DATABASE DB NAME --' and password=''核心逻辑:1=1 永真条件绕过验证,-注释屏蔽后续语句。

四、5种SQL注入防御方案

1. 输入过滤校验

核心操作:剔除非法字符、正则匹配、类型校验(客户端+服务器端双重验证)。

优势:简单易实现,成本低。

2. 参数化查询(预编译)

核心操作:使用占位符(?)替代直接拼接,语句与参数分离。

优势:防御效果最优,推荐首选。

3. 安全测试审计

核心操作:代码审查、工具扫描、上线后定期漏洞检测。

优势:多环节兜底,覆盖遗漏。

4. 数据库权限控制

核心操作:最小权限分配,限制用户操作范围。

优势:降低攻击影响面。

5. 隐藏错误信息

核心操作:不向用户暴露数据库结构、报错详情。

优势:避免攻击者获取敏感信息。

五、SQL预编译详解

1. 定义

将SQL语句模板化(占位符替代变量),编译后重复使用。

流程:词法语义解析→优化执行计划→编译缓存→参数替换执行

2. MySQL预编译实操

代码语言:javascript复制1.创建测试表

CREATE TABLEt(a int(11),b`varchar(20),UNIQUE KEY“ab`( a,`b ));

2.预编译SQL

PREPARE iNS FROM "INSERT INTO t SELECT ?,?';

3.绑定参数并执行

SET @a=999,@b='hello';

EXECUTE inS USING @a,@b;

4,释放资源

DEALLOCATE PREPARE ins;六、MyBatis防注入实战

1. #与$的核心区别

#:自动加引号,预编译处理;支持防注入(推荐),适用普通参数传递。

$:直接拼接SQL;不支持防注入;适用动态表名/列。

2. 示例

代码语言:javascript复制