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隐式转化整理

  • 相关阅读:
    redis:高可用分析
    mysql:explain分析sql
    python中注意事项(更新)
    jupyter使用小技巧(更新)
    Jupyter中的快捷键
    Excel制作甘特图
    Vim编辑器常用命令
    Mysql主从
    常用MySql命令
    进程与线程的一个简单解释
  • 原文地址:https://www.cnblogs.com/python-dd/p/12643116.html
Copyright © 2011-2022 走看看