zoukankan      html  css  js  c++  java
  • 关于MySQL隐式转换

    问题发现

    之前在学习sql注入时,有时感觉不应该得到的值却也得到了,没想明白是为什么,比如说:

    select * from users where id=1'
    

    这样的sql语句是照样可以把id=1的一行取到的,后来查了相关资料,了解到这是MySQL的隐式转换。

    大体内容

    这个链接给出了隐式转换中的一些规则,不过关于字符串的更加详细的规则,官方并没有给出,指出了这样一句话,

    In all other cases, the arguments are compared as floating-point (real) numbers. For example, a comparison of string and numeric operands takes places as a comparison of floating-point numbers.
    大致意思是:在所有其他情况下,将参数作为浮点数(实数)进行比较。 例如,将字符串和数字操作数进行比较,将其作为浮点数的比较。

    然后给了几个例子,我们可以从例子中总结一些规律。

    mysql> SELECT 1 > '6x';
            -> 0
    mysql> SELECT 7 > '6x';
            -> 1
    mysql> SELECT 0 > 'x6';
            -> 0
    mysql> SELECT 0 = 'x6';
            -> 1
    

    上面可以总结一下,字符串转换为数字时,从左边开始处理,遇到非数字字符,就停止了,如果第一个字符就是非数字字符,则为0,所以最开始那条sql语句也可以解释通了,相当与id=1。

    总结

    隐式转换还会发生在很多场景,比如操作符之类的,目前还没有太多sql经验,无法总结,总之这个坑挺大的,给sql注入也带来了很多可能,后面会再总结一些相关知识的。

    参考链接

    Mysql 数据类型隐式转换规则
    MySQL隐式转化整理

  • 相关阅读:
    golang以服务方式运行
    nginx重写规则配置
    PHP的 parse_ini_file 解析配置文件
    在Yii2中集成Markdown编辑器
    理解 is_callable
    Composer安装yii2-imagine 压缩,剪切,旋转,水印
    Yii2 基于header 实现接口版本控制
    (1) laravel php artisan list make
    php 阿里云国内短信实例
    php 云片国外短信实例
  • 原文地址:https://www.cnblogs.com/python-dd/p/12643116.html
Copyright © 2011-2022 走看看