点击标题下「蓝色微信名」可快速关注
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
select * from user table where
username='"+userName+"' and password='"+password+"'非法输入(用户名:''or 1=1 --,密码任意)
SELECT *FROM user table WHERE username='' or 1=1 -
- and password=‘’危害升级(除数据库)
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预编译实操
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. 示例
<!--安全写法(#占位符)-->
<select id="selectUser" parameterType="map" resultMap="BaseResultMap">
select id,username from user
where username =#{username,jdbcType=VARCHAR}
</select><!-- 风险写法($拼接)
<select id="selectUser" parameterType="map" resultMap="BaseResultMap">
select id,username from user
where username =${username,jdbcType=VARCHAR]
</select>如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发朋友圈