PHP中“==”的一些坑
PHP 是弱類型的語言,會自動進行數據類型轉換,這無疑給我們的開發帶來了極大的方便。可事實真是如此嗎?今天我們就從==
說起。
栗子
首先,看一下這段代碼。猜猜看結果會是什么
|
一眼看過,很明顯肯定都是false
吧,但運行代碼后發現全是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
加密而沒有加鹽,碰巧某用戶密碼加密涉及到數字,那么就有可能被碰撞破解!
解決
- 在開發過程中盡可能避免使用
==
判斷兩個變量的值 - 密碼加密最好使用
password_hash()
或者加鹽md5($pwd.$salt)