理解 Type Juggling
# Payload: { 'token': 0 } $payload = json_decode(json_encode(array('token' => 0))); $token = 'RaNdOmStRiNg1!'; echo "[PAYLOAD] " . gettype($payload->token) . "({$payload->token}) - "; echo "[TOKEN] {{$token}} - "; if($token != $payload->token) { die('Access Denied'); } echo 'Access Granted: Type Juggling Bypass';
如果我们在 3v4l != !== 而在>8.0中,类型杂耍发生了。
!=
!==
== 和 !==
==
A simpler test case :
var_dump(0 == 'Kittens');
Backward Incompatible Changes PHP/8发行说明部分:
数字和非数字字符串之间的非严格比较现在通过将数字转换为字符串并比较字符串来工作。数字和数字字符串之间的比较仍像以前一样工作。值得注意的是,这意味着0==“not-a-number”现在被认为是错误的。