概念:针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
攻击思路
- 寻找到SQL注入的位置
- 判断服务器类型和后台数据库类型
- 针对不同服务器和数据库特点进行SQL注入攻击
实例演示
数据库表字段:
表中数据:
手写SQL演示注入攻击
1、获取这张表的所有数据,只需要保证上面sql的where条件恒真就可以,客户端传参如果不经校验就会导致这种结果。
2、查询mysql版本号,使用union
拼接sql
3、查询数据库名
4、查询当前用户的所有库
总结:程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成SQL语句的一部分,一般通过字符串拼接的方式进行攻击。
防御办法
1. 代码层防止sql注入攻击的最佳方案就是sql预编译
- 使用Mybatis时,最好使用#,代表的是使用SQL预编译方式,$则代表使用拼接方式,不建议使用
PrepareStatement
也使用预编译的方式,而Statement
不会使用
2. 确认每种数据的类型,比如是数字,数据库则必须使用int类型来存储
3. 规定数据长度,能在一定程度上防止sql注入
4. 严格限制数据库权限,能最大程度减少sql注入的危害
5. 避免直接响应一些sql异常信息,sql发生异常后,自定义异常进行响应
6. 过滤参数中含有的一些数据库关键词