首頁  >  文章  >  後端開發  >  PHP中「==」的一些坑

PHP中「==」的一些坑

藏色散人
藏色散人轉載
2019-10-11 13:13:393139瀏覽

PHP 是弱型的語言,會自動進行資料型別轉換,這無疑為我們的開發帶來了極大的方便。但事實真是如此嗎?今天我們就從==說起。

範例

首先,先來看看這段程式碼。猜猜看結果會是什麼

<?php
var_dump(md5(&#39;240610708&#39;) == md5(&#39;QNKCDZO&#39;));
var_dump(md5(&#39;aabg7XSs&#39;) == md5(&#39;aabC9RqS&#39;));
var_dump(sha1(&#39;aaroZmOk&#39;) == sha1(&#39;aaK1STfY&#39;));
var_dump(sha1(&#39;aaO8zKZF&#39;) == sha1(&#39;aa3OFF9m&#39;));
var_dump(&#39;0010e2&#39; == &#39;1e3&#39;);
var_dump(&#39;0x1234Ab&#39; == &#39;1193131&#39;);
var_dump(&#39;0xABCdef&#39; == &#39; 0xABCdef&#39;);
var_dump(0 == &#39;abcdefg&#39;);
var_dump(1 == &#39;1abcdef&#39;);
?>

一眼看過,很明顯一定都是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加密而沒有加鹽,碰巧某用戶密碼加密涉及到數字,那麼就有可能被碰撞破解!

解決

1.在開發過程中盡可能避免使用==判斷兩個變數的值

2.密碼加密最好使用password_hash()或加鹽md5($pwd.$salt)

更多PHP相關知識,請造訪PHP中文網

以上是PHP中「==」的一些坑的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除