MYSQL中的where ‘1=1‘ 探讨
在学习MySQL时候,关于MySQL注入的例子
- 首先针对以下代码,实现的是关于sql注入时,一个普通登录所产生的的问题 - package com.java.lesson02; import com.java.lesson02.utils.JdbcUtils; import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement; public class SQLInjection {
 public static void main(String[] args) {
 // login("kuangshen", "123");
 login(" 'or '1=1", " 'or '1=1");
 } private static void login(String username, String password) {
 Connection connection = null;
 Statement statement = null;
 ResultSet resultSet = null;
 try {
 connection = JdbcUtils.getConnection();
 statement = connection.createStatement(); String sql = "SELECT * FROM users WHERE `NAME`='" + username + "' AND `PASSWORD`='" + password + "'";
 System.out.println(sql);
 resultSet = statement.executeQuery(sql);
 while (resultSet.next()) {
 System.out.println("name=" + resultSet.getString("NAME"));
 System.out.println("password=" + resultSet.getString("password"));
 System.out.println("===========================================");
 }
 } catch (SQLException throwables) {
 throwables.printStackTrace();
 }
 }
 }
 
- 如果模拟登录时传入的参数是这样的话, - login(" 'or '1=1", " 'or '1=1");,这样就产生了sql注入,可以看到的是,这样会获得所有用户的信息,因为这样进行模拟登录实际的sql语句是如下这样的:- SELECT * FROM users WHERE `NAME`=' 'or '1=1' AND `PASSWORD`=' 'or '1=1';
 
为什么where中字符串’1=1’会将所有的信息查出来?
1.where中AND,OR运算符的优先级
sql中和大多数语言一样,AND运算符的优先级要高于OR运算符。所以针对上述的sql语句可以等同于如下语句
SELECT * FROM users WHERE (`NAME`=' ') or ('1=1' AND `PASSWORD`=' ') or ('1=1');
2.分析where中的’1=1’
 针对这个疑问我查阅了一些资料,在csdn上看到这样一篇博客的讲解,具体内容参见参考文献的第二篇。从上面分析过的sql语句可以看出,前两个括号中的条件肯定都是为假的(因为一般情况下NAME和password不为空),那么只有可能的是最后一个括号返回的bool值恒为真。
		但是最后一个括号中'1=1'是为字符串的也不是一个条件表达式,为什么返回的恒为true呢?这个疑问在一篇博客中得到了解答。
3.MySQL中把字符串强转成数字有三种方式
 下面举例说明
- SELECT CAST('123' AS SIGNED);
- SELECT CONVERT('123',SIGNED);
- SELECT '123'+0;- CAST函数用法简介 - The CAST() function takes an expression of any type and produces a result value of a specified type, similar to CONVERT(). The syntax is: 
 CAST(character_string AS character_data_type CHARACTER SET charset_name)
 Example:
 SELECT CAST(_latin1’test’ AS CHAR CHARACTER SET utf8);
 If you use CAST() without specifying CHARACTER SET, the resulting character set and collation are defined by the character_set_connection and collation_connection system variables. If you use CAST() with CHARACTER SET X, the resulting character set and collation are X and the default collation of X. You may not use a COLLATE clause inside a CONVERT() or CAST() call, but you may use it outside. For example, CAST(… COLLATE …) is illegal, but CAST(…) COLLATE … is legal:
 SELECT CAST(_latin1’test’ AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;- 这是官方文档解释: - 大致用法就是 - CAST(字段名 AS 转换类型),其中针对字符串还可以设置字符集编码- 然后对于 - '1=1'- MySQL中针对字符串不满足数字正则的字符串会取前面满足数字正则的获取 - 举例说明如下:(这部分的内容参考了第二篇参考文章中的博客的内容,因为也是从那里得知的) 
- 下面语句不会查询出任何结果 - SELECT *
 FROM users
 WHERE '啥玩意啊?1'+0;
 
- 但是稍微修改如下: - SELECT *
 FROM users
 WHERE '1啥玩意啊'+0;
 - 只要在最前包含了满足数字正则的字符串,那么MySQL会将其取出来和后面的 - 0进行运算(如果没有后面的- 0的话,会直接转换成数字),这就是上面的第三种转换。- 因为 - '1啥玩意啊'中的 1被取出来了,那么1+0=1为真(因为0才为false,不为0的话为真),这样就将所有的结果查出来了。- SELECT *
 FROM users
 WHERE '1啥玩意啊';
 - 这个sql语句的结果和上面一样,MySQL会将’1’取出来转化为数字1。 
- 所以对于 - where '1=1',mysql其实将其转化成了- where 1故恒为真,所以会将所有的信息查出来- 所以开始的sql语句转化成如今的样子: - SELECT * FROM users WHERE ('1=1');
 - ==>>转化成: - SELECT * FROM users WHERE 1
 - 至此关于这个sql注入的例子探讨完毕。 
参考文献
MYSQL中的where ‘1=1‘ 探讨的更多相关文章
- mysql中group by存在局限性探讨(待续)
		现在有一个需求:在2018年游戏充值记录表(字段主要有: user_name , money , game_id , 表有6000w行)查找出哪些人在某段日期内累计充值金额在100~500元范围内的, ... 
- [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别
		本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ... 
- 如何在MySQL中查询每个分组的前几名【转】
		问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition语句来解决,但在mysql中就比较麻烦了.这次翻译的文章就是专门 ... 
- 一条SQL语句在MySQL中如何执行的
		本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ... 
- MySQL中实现DROP USER if EXISTS `test`,即创建新用户时检测用户是否存在
		MySQL中实现DROP USER if EXISTS `test`,即创建新用户时检测用户是否存在 版权声明:本文为博主原创文章,欢迎大家转载,注明出处即可.有问题可留言,会尽快回复,欢迎探讨 ... 
- 如何在mysql中查询每个分组的前几名
		问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition 语句来解决,但在MySQL中就比较麻烦了.这次翻译的文章就是 ... 
- 一条SQL语句在MySQL中是如何执行的
		概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ... 
- 【面试】MySQL 中NULL和空值的区别?
		做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 01 小木的故事 作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那 ... 
- 一步一步带你入门MySQL中的索引和锁 (转)
		出处: 一步一步带你入门MySQL中的索引和锁 索引 索引常见的几种类型 索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等.本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结 ... 
随机推荐
- 2020-04-13:怎么在日志里排查错误,该用哪些Linux命令
			能通过less命令打开文件,通过Shift+G到达文件底部,再通过?+关键字的方式来根据关键来搜索信息. 能通过grep的方式查关键字,具体用法是, grep 关键字 文件名,如果要两次在结果里查找的 ... 
- C#设计模式之9-装饰者模式
			装饰者模式(Decorator Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/405 访问. 装饰者模 ... 
- Python基础入门知识点——if 语句简介
			前言 if 语句是最简单的选择结构.如果满足条件就执行设定好的操作,不满足条件就执行其他其他操作. 判断的定义 如果 条件满足,才能做某件事情, 如果 条件不满足,就做另外一件事情,或者什么也不做 判 ... 
- (转载)sqlserver2008”备份集中的数据库备份与现有的XX数据库不同”解决办法
			原文链接:https://www.cnblogs.com/huangfr/archive/2012/08/09/2629687.html 因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不 ... 
- Android  app启动出现白屏闪屏
			出现白屏闪屏原因: 进入到AppStartActivity,但是未加载到布局文件,就先显示了窗口的背景,白屏就是显示的windows的背景,即所设置的theme. onCreate()中的setCon ... 
- RPC 框架 Dubbo 从理解到使用(一)
			技术架构演变 单一应用架构 通俗地讲,"单体应用(monolith application)"就是将应用程序的所有功能都打包成一个独立的单元.当网站流量很小时,只需一个应用,将所有 ... 
- Windows server 2008R2 中sql server的搭建
			一.安装sql server Step1:下载sql server 2008 r2 standard,解压到Windows的C:\下. Step2:打开安装程序,进行sql server的安装 Ste ... 
- springMVC入门(二)------springMVC入门案例
			简介 本案例主要完成了springMVC的基本配置,可针对响应的HTTP URL返回数据与视图 一.###web.xml的配置 要使springMVC生效,首先需要对web.xml进行配置,配置spr ... 
- 结构体深度比较 reflect.DeepEqual
			demo1 package main import ( "fmt" "reflect" ) func main() { sliceMap1 := make([] ... 
- Mybatis分页插件: pageHelper的使用及其原理解析
			在实际工作中,很进行列表查询的场景,我们往往都需要做两个步骤:1. 查询所需页数对应数据:2. 统计符合条件的数据总数:而这,又会导致我们必然至少要写2个sql进行操作.这无形中增加了我们的工作量,另 ... 
