1、什么是PHP哈希弱类型比较缺陷
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
关于PHP hash比较缺陷详细介绍:http://www.freebuf.com/news/67007.html
2 PHP比较
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
"==="和"!=="即strict比较符,只有在类型相同时才相等。"=="和"!="即non-strict比较符,会在类型转换后进行比较。
3 一些示例
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
?>
字符串在与数字比较前会自动转换为数字,所以0=="a"了。
另外两个字符串比较,如果两个都是数字形式,则同时转换为数字进行比较,所以"1"=="01"。
这时你要问了,wordpress的代码中是将cookie中的hash和真实hash这两个hash的字符串进行比较,和这个有什麽关系呢?
我们注意上面"10"=="1e1"这个例子,php智能的将科学计数形式的字符串转换为对应数字(1e1 = 1*10^1 = 1)。两个不同的字符居然相等了,不知到这裡你是否得到了启示?
好吧,来一个明显的,你一定会恍然大悟:
var_dump("0e123456789012345678901234567890"==="0") //false
var_dump("0e123456789012345678901234567890"=="0") //true
当hash以"0exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"之类的形式出现时,与"0"相等。