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

原文地址:https://www.cnblogs.com/python-dd/p/12643116.html