12select * from <表名> where id = 'x and 1=1' select * from <表名> where id = 'x and 1=2'
查询语句将 and 语句全部转换为了字符串 , 并没有进行 and 的逻辑判断 , 所以不会出现以上结果 , 故假设是不成立的 。
4.2.2 字符型判断
当输入的参 x 为字符型时 , 通常 abc.php 中 SQL 语句类型大致如下: select * from <表名> where id = ‘x’ 这种类型我们同样可以使用 and ‘1’=’1 和 and ‘1’=’2来判断:
Url 地址中输入 http://xxx/abc.php?id= x’ and ‘1’=’1 页面运行正常 , 继续进行下一步 。
Url 地址中继续输入 http://xxx/abc.php?id= x’ and ‘1’=’2 页面运行错误 , 则说明此 Sql 注入为字符型注入 。
原因如下: 当输入 and ‘1’=’1时 , 后台执行 Sql 语句:
1select * from <表名> where id = 'x' and '1'='1'
语法正确 , 逻辑判断正确 , 所以返回正确 。
当输入 and ‘1’=’2时 , 后台执行 Sql 语句:
1select * from <表名> where id = 'x' and '1'='2'
语法正确 , 但逻辑判断错误 , 所以返回正确 。同学们同样可以使用假设法来验证 。
5、Sql注入实例
5.1 绕过登陆
我们正常的登陆是输入用户名密码到后台数据库判断用户名密码是否正确 , 看看后台代码是如何实现的
1select * from user where username = '$name' and password = '$pwd'"
用户名密码都输入123 , 实际执行的sql语句是:
1select * from users where username='123' and password='123'
我们尝试在用户名中输入 123’ or 1=1 #, 密码同样输入 123’ or 1=1 #显示登陆成功 , 为什么会登录成功呢 , 我们来看看实际执行的sql语句
1select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
按照 MySQL 语法 , # 后面的内容会被忽略 , 所以以上语句等同于(实际上密码框里不输入任何东西也一样):
1select * from users where username='123' or 1=1
由于判断语句 or 1=1 恒成立 , 所以结果当然返回真 , 成功登录 。我们再尝试不使用 # 屏蔽单引号 , 采用手动闭合的方式: 我们尝试在用户名中输入 123’ or ‘1’=’1, 密码同样输入 123’ or ‘1’=’1 (不能少了单引号 , 否则会有语法错误): 此处输入图片的描述 此处输入图片的描述 实际执行的 Sql 语句是:
1select * from users where username='123' or '1'='1' and password='123' or '1'='1`
看到了吗?两个 or 语句使 and 前后两个判断永远恒等于真 , 所以能够成功登录 。
还有通过sql语句注入来获取隐私信息 , 所以sql注入需要引起程序员们的注意 。
6、预防Sql注入的方法
下面我针对JSP , 说一下应对方法:
(1)(简单又有效的方法)PreparedStatement
采用预编译语句集 , 它内置了处理SQL注入的能力 , 只要使用它的setXXX方法传值即可 。
使用好处:
(1).代码的可读性和可维护性.
(2).PreparedStatement尽最大可能提高性能.
(3).最重要的一点是极大地提高了安全性.
原理:
sql注入只对sql语句的准备(编译)过程有破坏作用
而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,
而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.
(2) 使用正则表达式过滤传入的参数
要引入的包:
import JAVA.util.regex.*;
正则表达式:
private String CHECKSQL = “^(.+)sands(.+)|(.+)sor(.+)s$”;
判断是否匹配:
Pattern.matches(CHECKSQL,targerStr);
下面是具体的正则表达式:
检测SQL meta-characters的正则表达式 :
/(%27)|(’)|(–)|(%23)|(#)/ix
修正检测SQL meta-characters的正则表达式 :/((%3D)|(=))[^n]*((%27)|(’)|(–)|(%3B)|(:))/i
典型的SQL 注入攻击的正则表达式 :/w*((%27)|(’))((%6F)|o|(%4F))((%72)|r|(%52))/ix
检测SQL注入 , UNION查询关键字的正则表达式 :/((%27)|(’))union/ix(%27)|(’)
检测MS SQL Server SQL注入攻击的正则表达式:
推荐阅读
- 太极拳的基本功练习 腿功
- 太极拳的基本功练习 腰功
- 太极拳的基本功练习 肩臂功
- 变频空调基本原理介绍
- 不耐摔、维修还贵,为什么如今的手机基本都是玻璃机身?原因为何
- 室外攀岩的基本技巧 热身抱石动作规范
- 一文搞懂MySQL的Join,聊一聊秒杀架构设计
- Mysql无法启动情况下,如何恢复数据?
- 腾讯云服务器上安装mysql,并用navicat连接
- 在使用mysql数据库时,遇到重复数据怎么处理?