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

博客围绕PHP中==比较的隐式转换问题展开。通过下载源码发现MD5加密字符串及登录判断代码,利用隐式转换规则找到登录key。还参考了PHP手册,在调试官方例子时发现==比较时字符串转换为数值的情况不稳定,提出可能与底层hash算法有关的猜想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值