SQL注入很多都由于开发习惯和经验导致的,会给系统运行,带来易被攻击的风险,这需要我们在日常的开发过程中,了解一些SQL合规编写的技能,才能让我们的程序更加地健壮,增长我们的经验。
一、什么是SQL注入?
定义:Web程序数据库层安全漏洞,网络攻击常用方式。
核心原理:利用程序员编码疏忽,在用户输入中注入SQL语句,被数据库服务器误执行。
危害:无账号登录、未授权数据访问、数据库篡改/删除。
二、SQL注入的4大原理
- 拼接查询:通过分号分隔命令(例:1234;DELETE FROM user)
- 利用注释执行:插入注释符号屏蔽原有逻辑(例:1’OR SLEEP(500)–)
- 传入非法参数:未处理特殊字符(例:用户名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注入防御方案
- 输入过滤校验
核心操作:剔除非法字符、正则匹配、类型校验(客户端+服务器端双重验证)。
优势:简单易实现,成本低。
- 参数化查询(预编译)
核心操作:使用占位符(?)替代直接拼接,语句与参数分离。
优势:防御效果最优,推荐首选。
- 安全测试审计
核心操作:代码审查、工具扫描、上线后定期漏洞检测。
优势:多环节兜底,覆盖遗漏。
- 数据库权限控制
核心操作:最小权限分配,限制用户操作范围。
优势:降低攻击影响面。
- 隐藏错误信息
核心操作:不向用户暴露数据库结构、报错详情。
优势:避免攻击者获取敏感信息。
五、SQL预编译详解
- 定义
将SQL语句模板化(占位符替代变量),编译后重复使用。
流程:词法语义解析→优化执行计划→编译缓存→参数替换执行
- MySQL预编译实操
1.创建测试表
CREATE TABLEt(a int(11),bvarchar(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防注入实战
- #与$的核心区别
:自动加引号,预编译处理;支持防注入(推荐),适用普通参数传递。
$:直接拼接SQL;不支持防注入;适用动态表名/列。
- 示例
select id,username from user where username =#{username,jdbcType=VARCHAR} <!– 风险写法($拼接)
select id,username from user where username =${username,jdbcType=VARCHAR]
声明:来自bisal的个人杂货铺,仅代表创作者观点。链接:http://eyangzhen.com/5055.html