PHP的弱類型安全隱患及防範,讓黑客無路可走!

摘要: 字符串與數字對比和函數返回值與數字對比

字符串與數字對比

原理:


PHP的弱類型安全隱患及防範,讓黑客無路可走!


php的對比運算時,是會將兩個變量都轉換為相同類型,不同變量的無法對比 當字符串和int類型對比時,將會把字符串轉化為int類型,相當於字符串在底層執行了一次intval()函數. 至於為什麼數字放前面就能intval,放後面就不行,是因為: 該字符串的開始部分決定了它的值,如果該字符串以合法的數值開始,則使用該數值,否則其值為0。 怪不得有些網站註冊時非要名字以字符串開頭….

注意:如果字符串在比較時帶有’e’,’E’時,會被解析為科學計數法,如var_dump('1e123' == '1');為false

案例1:


PHP的弱類型安全隱患及防範,讓黑客無路可走!


案例2:


PHP的弱類型安全隱患及防範,讓黑客無路可走!


延伸: 如果字符串和數字比較會出現類型轉換的問題,那麼一些php自帶函數會不會出現相同的問題?


PHP的弱類型安全隱患及防範,讓黑客無路可走!


雖然也會出現問題,但是一直都有解決的方案,in_array()存在第三個參數,決定是否嚴格檢查, 默認為false , 相當與 “==” , 傳入true ,相當於”===” 還有很多這樣的函數,如array_search(),這裡不一一介紹了

函數返回值與數字對比


PHP的弱類型安全隱患及防範,讓黑客無路可走!


這段代碼便可以使用傳入數組來繞過 因為用strcmp()對比數組和字符串時返回值為null, 但是 null == 0為true ,所以繼續執行

md5() 函數傳入數組會返回null; 但是小編看了下網上的例子, 真的認為完全不合邏輯,就暫時一筆帶過

總結 一定要做好參數的過濾,在使用他之前 應該常用 “===” 來判斷,而不是”==” 應該瞭解每一個常用函數的參數和返回值,儘量採用嚴格模式


分享到:


相關文章: