墨者 - PHP代码分析溯源(第2题)

下载源码,发现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在线代码调试工具

知道的朋友评论一下,求解惑

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值