问题发现
之前在学习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注入也带来了很多可能,后面会再总结一些相关知识的。