下载源码,发现MD5加密字符串
发现代码 if ($a != 'QNKCDZO' && $a1 == $a2) 则登录成功
因为是==比较值,所以存在隐式转换问题,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。
上网找到这个链接:https://segmentfault.com/a/1190000002784965
MD5('QNKCDZO')与 MD5('240610708') 解密出来的值
md5('240610708') 的结果是:0e462097431906509019562988736854
md5('QNKCDZO') 的结果是:0e830400451993494058024219903391
两个值都是0e开头,在计算器运算上分别是
0*e^ 462097431906509019562988736854 = 0
0*e^ 830400451993494058024219903391 = 0
数值上相等,所以填入值240610708找到key
一些拓展与疑问
在关于==的问题,博主在网上找到php手册https://www.php.net/manual/zh/language.operators.comparison.php。
里面也有提到,当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。
$a == $b | 等于 | TRUE ,如果类型转换后 $a 等于 $b。 |
$a === $b | 全等 | TRUE ,如果 $a 等于 $b,并且它们的类型也相同。 |
问题就在这里了,手册说如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。
当执行官方例子的时候,是没问题的
但是当==的另一边出现换成其他值时候,调试为false
再换一个试一下,值发生了转换,返回true
问题:官方文档的意思不是说只要比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行吗?为什么有的可以转换有的却不可以?
猜想:==可能和java一样调用到底层的hash()相关算法,进行二进制/十六进制运算,没深究
环境:https://www.dooccn.com/php7/ php7在线代码调试工具
知道的朋友评论一下,求解惑