PHP 是弱類型的語言,會自動進行數據類型轉換,這無疑給我們的開發(fā)帶來了極大的方便??墒聦嵳媸侨绱藛幔拷裉煳覀兙蛷?=說起。
例子
首先,看一下這段代碼。猜猜看結果會是什么
<?php var_dump(md5('240610708') == md5('QNKCDZO')); var_dump(md5('aabg7XSs') == md5('aabC9RqS')); var_dump(sha1('aaroZmOk') == sha1('aaK1STfY')); var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m')); var_dump('0010e2' == '1e3'); var_dump('0x1234Ab' == '1193131'); var_dump('0xABCdef' == ' 0xABCdef'); var_dump(0 == 'abcdefg'); var_dump(1 == '1abcdef'); ?>
一眼看過,很明顯肯定都是false吧,但運行代碼后發(fā)現全是true!
WTF!
為什么會這樣?
開頭我已經說過了,PHP 是弱類型的語言。使用==對比兩個變量時,當有一個變量為整數,另外一個變量也會轉換為整數。這也就解釋了,為什么0 == 'abcdefg'和1 == '1abcdef'會成立。
但是,其他的代碼呢?字符串難道還會轉換?
PHP 手冊上為我們提供了解釋說明。
If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically.
也就是說,如果你比較的兩個字符串涉及到數字(如:"0"),那么每個字符串都會轉換成數字。
在這里,我不得不說:PHP是最好的語言!
危害
當我們的網站是直接MD5或Sha1加密而沒有加鹽,碰巧某用戶密碼加密涉及到數字,那么就有可能被碰撞破解!
解決
1.在開發(fā)過程中盡可能避免使用==判斷兩個變量的值
2.密碼加密最好使用password_hash()或者加鹽md5($pwd.$salt)