首頁 後端開發 php教程 PHP弱型別問題總結

PHP弱型別問題總結

Nov 08, 2016 am 10:38 AM

前陣子做了南京郵電大學網路攻防平台上面的題目,寫了一個writeup之後,還有必要總結一下。由於做的題目都是web類型的,所有的題目都是使用PHP來寫的,所以很多題目並沒有考察到傳統的如SQL注入,XSS的類型的漏洞,很多都是PHP本身語法的問題。鑑於目前PHP是世界上最好的語言,PHP本身的問題也可以算是web安全的一個面向。在PHP訓練中的特性就是弱型,以及內建函數對於傳入參數的鬆散處理。這篇文章主要是記錄我在做攻防平台上面遇到的PHP的函數中存在的問題,以及PHP的弱型態所帶來的問題。 
PHP弱點型簡介 
在PHP中,可以進行一下的操作。
$param = 1; 
$param = array(); 
$param = "stringg"; 
弱類型的語言對變數的資料類型沒有限制,你可以在任何地時候將變數賦值給任意的其他類型的變量,同時變數也可以轉換成任意地其他類型的資料。 
型轉換問題 
型轉換是無法避免的問題。例如需要將GET或是POST的參數轉換為int類型,或是兩個變數不符的時候,PHP會自動地進行變數轉換。但是PHP是一種弱型的語言,導致在進行型別轉換的時候會存在很多意想不到的問題。
比較運算子 
型轉換 
在$a==$b的比較中 
$a=null;$b=flase ; //true 
$a='';$b=null; //true 
這樣的例子還有很多,這種比較都是相等。
使用比較運算子的時候也有型別轉換的問題,如下: 
0=='0' //true 
0 == 'abcdefg' //true 
0 === 'abcdefg' //false 
1 = = '1abcdef' //true 
當不同類型的變數進行比較的時候就會有變數轉換的問題,轉換後就有可能會有問題。 
Hash比較 
除了以上的這種方式之外在進行hash比較的時候也會有問題。如下: 
"0e132456789"=="0e7124511451155" //true 
"0e123456abc"=="0e1dd 種字串,就會將此字串解析為科學計數法。所以上面例子中2個數的值都是0因而就相等了。如果不滿足0ed+這種模式就不會相等。這個題目在攻防平台中的md5 collision就有考到。 
十六進位轉換 
也存在一個十六進位餘字串進行比較運算時的問題。範例如下: 
"0x1e240"=="123456" //true 
"0x1e240"==123456 //true 
"0x1e240"=="1e240" //false 
"0x1e240"=="1e240" //false 
"0x1e240"=="1e240" //false 
當其中的一個開始時的一個開始, PHP會將此字串解析成為十進位然後再比較,0×1240解析變成十進位就是123456,所以與int型別和string型別的123456比較都是相等。攻防平台中的起名字真難就是考察的這個特性。 
型轉換 
常見的轉換主要是int轉換成string,string轉換為int。 
int轉string: 
$var = 5; 
方式1:$item = (string)$var; 
方式2:$item = strval($var); 
string轉int:intval()函數。 
對於這個函數,可以先看2個例子。
var_dump(intval('2')) //2 
var_dump(intval('3abcd')) //3 
var_dump(intval('abcd')) //0 
說明intval()轉換的時候,就會將從字串的開始進行轉換知道遇到一個非數字的字元。即使出現無法轉換的字串,intval()不會報錯而是回傳0。 
intval()的這種特性在攻防平台中的MYSQL這題目中就有考到。
同時,程式設計師在程式設計的時候也不應該使用以下的這段程式碼: 
if(intval($a)>1000) { 
    mysql_query("select * from news where id=".$a) 











} 🎜} 🎜} 🎜} 🎜} 🎜} 🎜} 🎜} 🎜} 🎜} 這時候$a的值有可能是1002 union….. 🎜內建函數的參數的鬆散性 🎜內建函數的鬆散性說的是,呼叫函數時給函數傳遞函數無法接受的參數類型。解釋起來有點拗口,還是直接透過實際的例子來說明問題,以下會重點介紹幾個這個函數。 🎜md5() 🎜$array1[] = array( 🎜    "foo" => "bar", 🎜    "bar" => "foo", 🎜); 🎜); 🎜 hello", "world"); 🎜var_dump(md5($array1)==var_dump($array2)); //true 🎜PHP手冊中的md5()函數的描述是string md5 ( string $str [, bool $raw_output = false ] ),md5()中的需要是一個string類型的參數。但當你傳遞一個array時,md5()不會報錯,知識會無法正確地求出array的md5值,這樣就會導致任意2個array的md5值都會相等。這個md5()的特性在攻防平台中的bypass again同樣有考到。 
strcmp() 
strcmp()函數在PHP官方手冊中的描述是int strcmp ( string $str1 , string $str2 ),需要給strcmp()傳遞2個string類型的參數。如果str1小於str2,回傳-1,相等回傳0,否則回傳1。 strcmp函數比較字串的本質是將兩個變數轉換為ascii,然後進行減法運算,然後根據運算結果來決定傳回值。 
如果傳入給strcmp()的參數是數字呢? 
$array=[1,2,3]; 
var_dump(strcmp($array,'123')); //null,在某種意義上null也就是相當於false。 
strcmp此特性在攻防平台中的pass check有考到。 
switch() 
如果switch是數字類型的case的判斷時,switch會將其中的參數轉換為int型別。如下: 
$i ="2abc"; 
switch ($i) { 
case 0: 
case 1: 
case 2: 
    echo "i not less break 3 
echo "i is 3"; 

這個時候程式輸出的是i is less than 3 but not negative,是由於switch()函數將$i進行了型別轉換,轉換結果為2。
in_array() 
在PHP手冊中,in_array()函數的解釋是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),如果strict參數沒有提供,那麼in_array就會使用鬆散比較來判斷$needle是否在$haystack中。當strince的值為true時,in_array()會比較needls的型別和haystack中的型別是否相同。
$array=[0,1,2,'3']; 
var_dump(in_array('abc', $array));  //true 
var_dump(in_array('1bc', $array)); //true
可以看到上面的情況回傳的都是true,因為'abc'會轉換為0,'1bc'轉換為1。 
array_search()與in_array()也是相同的問題。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

See all articles