PHP的弱資料型別安全

2021-10-03 15:57:07 字數 1198 閱讀 9370

若型別,即在變數在使用過程中無需進行型別宣告,資料型別根據**執**況可以動態變換(區別強型別指得是每個變數和物件都必須具有宣告型別,它們是在編譯時就確定了型別都資料,在執行時不能更改)。

由於php的若資料型別特性,使得php易學和易用,但正是由於這一點,在使用雙等號『==』和某些函式時,會造成一定的安全隱患。比如下面例子:

<?php

var_dump(0 == '***');

var_dump(0 == '0***');

?

都會輸出true,這會造成我們某些驗證中,可以通過傳入引數0巧妙地被跳過,所以我們應該在判斷等於時用 === 來判斷

我們的密碼經過hash雜湊計算後,是有可能以0開頭的,那麼我們在進行判斷時同樣可以傳入引數0跳過某些系統邏輯。在5.6版本以後,新增了hash_equals()函式用來比較hash值,可以避免對比被惡意跳過。如果版本低於5.6也沒有關係,可以自己定義實現該函式:

if(!function_exists('hash_equals'))    

$len = strlen($a)

if($len !== strlen($b))

$status = 0;

for($i = 0; $i < $len; $i++)

return $status === 0;

}}

在使用json_decode()和unserialize()函式時,部分結構有肯能會被解析成bool型別,造成比較缺陷,下面**會輸出true

<?php

var_dump(true == 'root');

?>

避免的方法是,比較json_decode和unserialize函式解析的變數,用 === 三等號。

當整形超出php整型範圍時,php_int_max(9223372036854775807)和 php_int_min(-9223372036854775808)會按照最大或最小值進行保留和計算,輸入超出範圍值時,可能會造成業務邏輯錯誤,所以在判斷整型的地方需要判斷是否超出最大最小值。

當在switch中使用case判斷數字時,switch會將其中的引數轉換為int型別進行計算,加入case判斷0,那麼傳入任意string都可以執行case0的邏輯,所以在進入switch前一定要判斷資料型別的合法性,同時在業務中如果可以的話,盡量避免case為0的判斷。

PHP弱資料型別的內部實現

php那個該死的若型別是怎麼實現的 開啟php 中zend.h和zend types.h可以看到有如下定義 typedef union zvalue value str 字串 hashtable ht hash表 zend object obj php物件儲存結構 zvalue value stru...

PHP弱資料型別的內部實現

php那個該死的若型別是怎麼實現的 開啟php 中zend.h和zend types.h可以看到有如下定義 typedef union zvalue value str 字串 hashtable ht hash表 zend object obj php物件儲存結構 zvalue value stru...

PHP弱型別安全問題總結

前段時間做了南京郵電大學網路攻防平台上面的題目,寫了乙個writeup之後,還有必要總結一下。由於做的題目都是web型別的,所有的題目都是使用php來寫的,所以很多題目並沒有考察到傳統的如sql注入,xss的型別的漏洞,很多都是php本身語法的問題。鑑於目前php是世界上最好的語言,php本身的問題...