在学习MySQL时候,关于MySQL注入的例子

  1. 首先针对以下代码,实现的是关于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();
    }
    }
    }
  2. 如果模拟登录时传入的参数是这样的话,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中把字符串强转成数字有三种方式

​ 下面举例说明

  1. SELECT CAST('123' AS SIGNED);

  2. SELECT CONVERT('123',SIGNED);

  3. 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中针对字符串不满足数字正则的字符串会取前面满足数字正则的获取

    举例说明如下:(这部分的内容参考了第二篇参考文章中的博客的内容,因为也是从那里得知的)

  4. 下面语句不会查询出任何结果

    SELECT *
    FROM users
    WHERE '啥玩意啊?1'+0;

  5. 但是稍微修改如下:

    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。

  6. 所以对于 where '1=1',mysql其实将其转化成了 where 1故恒为真,所以会将所有的信息查出来

    所以开始的sql语句转化成如今的样子:

    SELECT * FROM users WHERE ('1=1');

    ==>>转化成:

    SELECT * FROM users WHERE 1

    至此关于这个sql注入的例子探讨完毕。

参考文献

MYSQL中的where ‘1=1‘ 探讨的更多相关文章

  1. mysql中group by存在局限性探讨(待续)

    现在有一个需求:在2018年游戏充值记录表(字段主要有: user_name , money , game_id , 表有6000w行)查找出哪些人在某段日期内累计充值金额在100~500元范围内的, ...

  2. [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. 如何在MySQL中查询每个分组的前几名【转】

    问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等. 在orcale等数据库中可以使用partition语句来解决,但在mysql中就比较麻烦了.这次翻译的文章就是专门 ...

  4. 一条SQL语句在MySQL中如何执行的

    本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...

  5. MySQL中实现DROP USER if EXISTS `test`,即创建新用户时检测用户是否存在

    MySQL中实现DROP USER if EXISTS `test`,即创建新用户时检测用户是否存在    版权声明:本文为博主原创文章,欢迎大家转载,注明出处即可.有问题可留言,会尽快回复,欢迎探讨 ...

  6. 如何在mysql中查询每个分组的前几名

    问题 在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等.  在orcale等数据库中可以使用partition 语句来解决,但在MySQL中就比较麻烦了.这次翻译的文章就是 ...

  7. 一条SQL语句在MySQL中是如何执行的

    概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...

  8. 【面试】MySQL 中NULL和空值的区别?

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 01 小木的故事 作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那 ...

  9. 一步一步带你入门MySQL中的索引和锁 (转)

    出处: 一步一步带你入门MySQL中的索引和锁 索引 索引常见的几种类型 索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等.本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结 ...

随机推荐

  1. Hyperledger Fabric介绍

    转载地址 https://blog.csdn.net/xiaonu123/article/details/81006936 简介 Hyperledger介绍 超级账本(Hyperledger)项目是首 ...

  2. vue 三元表达式当出现elif

    方式一: <span class="person_name">{{item.type_name == '车商' ? item.title : item.type_nam ...

  3. puppeteer去掉同源策略及请求拦截

    puppeteer是一个功能强大的工具,在自动化测试和爬虫方面应用广泛,这里谈一下如何在puppeteer中关掉同源策略和进行请求拦截. 同源策略 同源策略为web 安全提供了有力的保障,但是有时候我 ...

  4. 笔记:Linux用户管理(补充)、权限管理、内存管理、网络管理、渗透常用命令

    一.用户管理(补充) 添加用户:useradd [选项] 用户名 useradd -u 5000 -g demogroup -G root -d /home/demo -s /bin/bash dem ...

  5. Flutter FlatButton 按钮基本各种用法

    Flutter中给我们预先定义好了一些按钮控件给我们用,常用的按钮如下 RaisedButton :凸起的按钮,其实就是Android中的Material Design风格的Button ,继承自Ma ...

  6. 瑞发科NS1081主控 + THGBM5G7A2JBAIR(eMMC) 制作16GB闪存驱动器

    文档标识符:NS1081_FLASH-DRIVE_D-P9 作者:DLHC 最后修改日期:2020.8.22 本文链接:https://www.cnblogs.com/DLHC-TECH/p/NS10 ...

  7. COS418, Distributed System, Go Language

    本博客是MIT的分布式系统课程的课后作业Cos418的GO语言实现思路.由于时间有限,目前只实现了assignment1~2. 在common.go中设置debugEnabled = true,go ...

  8. 7. Jackson用树模型处理JSON是必备技能,不信你看

    每棵大树,都曾只是一粒种子.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BA ...

  9. Linux环境下MySQL 5.6安装与配置----亲测有效----纯离线安装

    一.安装MySQL 1.下载安装包 mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz 下载地址: https://dev.mysql.com/get/Downloa ...

  10. vs使用fscanf和fprintf错误警告处理

    严重性代码说明项目文件行 禁止显示状态错误 C4996 fopen('fscanf'.strcmp):This function or variable may be unsafe. 最全解决办法(转 ...