搜尋
首頁後端開發php教程談PHP弱型別安全問題

談PHP弱型別安全問題

Apr 27, 2019 am 11:37 AM
php弱類型

這篇文章小編想和大家談談PHP弱類型,PHP弱類型給程式設計師書寫程式碼帶來了很大的便利,但是任何事物都有兩面性,現在隨著小編一起了解一下吧。

0x00 弱型別初探

#沒有人質疑php的簡單強大,它提供了許多特性供開發者使用,其中一個就是弱類型機制。

在弱型別機制下 你能夠執行這樣的操作

<?php
$var = 1;
$var = array();
$var = "string";
?>

php不會嚴格檢驗傳入的變數型別,也可以將變數自由的轉換型別。

例如在$a == $b的比較中

$a = null; $b = false; //为真
$a = &#39;&#39;; $b = 0; //同样为真

然而,php核心的開發者原本是想讓程式設計師藉由這種不需要宣告的體系,更有效率的開發,所以在幾乎所有內建函數以及基本結構中使用了很多鬆散的比較和轉換,防止程式中的變數因為程式設計師的不規範而頻繁的報錯,然而這卻帶來了安全問題。

0x02 知識預備php核心之zval結構

在PHP中宣告的變量,在ZE中都是用結構體zval來保存的

zval的定義在zend/zend.h

typedef struct _zval_struct zval;  
struct _zval_struct {  
  /* Variable information */  
  zvalue_value value; /* value */  
  zend_uint refcount__gc;  
  zend_uchar type;/* active type */  
  zend_uchar is_ref__gc;  
};  
typedef union _zvalue_value {  
  long lval;  /* long value */  
  double dval;/* double value */  
  struct {  
    char *val;  
    int len;  
  } str;  
  HashTable *ht;  /* hash table value */  
  zend_object_value obj;  
} zvalue_value;

其中php透過type判斷變數型別存入value

如上也就是php核心中弱型別的封裝,也是我們後面講的所有東西的原理和基礎。

0x03變數的強制轉換

#透過剛剛的了解,我們知道zval.type決定了儲存到zval.value的類型。

當原始碼進行一些未限制類型的比較,或數學運算的時候,可能會導致zval.type的改變,同時影響zval.value的內容改變。

當int遇到string

cp.1 數學運算

當php進行一些數學運算的時候

ar_dump(0 == &#39;0&#39;); // true
var_dump(0 == &#39;abcdefg&#39;); // true  
var_dump(0 === &#39;abcdefg&#39;); // false
var_dump(1 == &#39;1abcdef&#39;); // true

當有一個對比參數是整數的時候,會把另一個參數強制轉換為整數。

相當於對字串部分

intval再和整數部分比較,其實也就是改變了zval.type的內容尤為注意的是,'1assd'的轉換後的值是1 ,而'asdaf'是0

也說明了intval會從第一位不是數字的單位開始進行

所有也有

var_dump(intval(&#39;3389a&#39;));//输出3389

這個例子就告訴我們,永遠不要相信下面的程式碼

if($a>1000){    
mysql_query(&#39;update ... .... set value=$a&#39;)
}

你以為這時候進入該支的萬無一失為整數了

其實$a可能是1001/**/union...

#cp.2 語句條件的鬆散判斷

舉例php的switch使用了鬆散比較. $which會被自動intval變成0如果每個case裡面沒有break ,就會一直執行到包含,最終執行到我們需要的函數,這裡是成功包含

<?php
if (isset($_GET[&#39;which&#39;]))
{
  $which = $_GET[&#39;which&#39;];
  switch ($which)
  {
  case 0:
  case 1:
  case 2:
    require_once $which.&#39;.php&#39;;
    break;
  default:
    echo GWF_HTML::error(&#39;PHP-0817&#39;, &#39;Hacker NoNoNo!&#39;, false);
    break;
  }

cp.3 函數的鬆散判斷

var_dump(in_array("abc", $array));

in_array — 檢查數組中是否存在某個值參數

needle 待搜尋的值。

Note: 如果 needle 是字串,則比較是區分大小寫的。 haystack 這個數組。

strict 如果第三個參數 strict 的值為 TRUE 則 in_array() 函數也會檢查 needle 的型別是否和 haystack 中的相同。

可以看到,只有加了strict才會對型別做嚴格比較, 那我們再把×××和字串做比較呢?

var_dump(in_array("abc", $array1));</br>
var_dump(in_array("1bc", $array2));

它遍歷了array的每個值,並且作"=="比較(“當設定了strict 用===”)

結果很明顯了

如果array1裡面有個值為0,那麼第一條回傳就會為真//intval('abc')=0

如果array2裡面有個值為1,那麼第二條就會為真//intval('1bc')=1

array_search也是一樣的原理

這裡的應用就很廣泛了,

很多程式設計師都會檢查數組的值,

那麼我們完全可以用建構好的int 0或1 騙過檢測函數,使它回傳為真

總結一下, 在所有php認為是int的地方輸入string,都會被強制轉換,例如

$a = &#39;asdfgh&#39;;//字符串类型的a</br>
echo $a[2];  //根据php的offset 会输出&#39;d&#39;</br>
echo $a[x];  //根据php的预测,这里应该是int型,那么输入string,就会被intval成为0 也就是输出&#39;a&#39;

當陣列遇上string

這一個例子我是在德國的一個ctf中遇到,很有意思前面我們講的都是string和int的比較

那麼array碰上int或是string會有什麼化學反應?

由php手冊我們知道

Array轉換整數int/浮點型float會傳回元素個數;

轉換bool傳回Array中是否有元素;轉換成string回傳'Array',並拋出warning。

那麼實際應用是怎麼樣的呢?

if(!strcmp($c[1],$d) && $c[1]!==$d){
...
}

可以發現,這個分支透過strcmp函數比較要求兩者相等且「==」要求兩者不相等才能進入。

strcmp() 函數比較兩個字串。

此函數傳回:

0 - 如果兩個字串相等

>0 - 如果string1大於string2

這裡的strcmp函數其實是將兩個變數轉換成ascii 然後做數學減法,傳回一個int的差值。

也就是說鍵入'a'和'a'進行比較得到的結果就是0

那麼如果讓$array和‘a’比較呢?

http://localhost:8888/1.php?a[]=1
var_dump(strcmp($_GET[a],&#39;a&#39;));

這時候php回傳了null!

也就是說,我們讓這個函數出錯從而使它恆真,繞過函數的檢查。

0x04時時防備弱型別

#身為程式設計師,弱型別確實為程式設計師書寫程式碼帶來了很大的便利,但也讓程式設計師忘記了$array =array();的習慣。都說一切輸入都是有害的

那麼其實可以說一切輸入的類型也是可疑的,永遠不要相信弱類型的php下任何比較函數,任何數學運算。否則,你絕對是被php出賣的那一個。

相關教學:PHP影片教學

#

以上是談PHP弱型別安全問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:51cto。如有侵權,請聯絡admin@php.cn刪除
絕對會話超時有什麼區別?絕對會話超時有什麼區別?May 03, 2025 am 12:21 AM

絕對會話超時從會話創建時開始計時,閒置會話超時則從用戶無操作時開始計時。絕對會話超時適用於需要嚴格控制會話生命週期的場景,如金融應用;閒置會話超時適合希望用戶長時間保持會話活躍的應用,如社交媒體。

如果會話在服務器上不起作用,您將採取什麼步驟?如果會話在服務器上不起作用,您將採取什麼步驟?May 03, 2025 am 12:19 AM

服務器會話失效可以通過以下步驟解決:1.檢查服務器配置,確保會話設置正確。 2.驗證客戶端cookies,確認瀏覽器支持並正確發送。 3.檢查會話存儲服務,如Redis,確保其正常運行。 4.審查應用代碼,確保會話邏輯正確。通過這些步驟,可以有效診斷和修復會話問題,提升用戶體驗。

session_start()函數的意義是什麼?session_start()函數的意義是什麼?May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

為會話cookie設置httponly標誌的重要性是什麼?為會話cookie設置httponly標誌的重要性是什麼?May 03, 2025 am 12:10 AM

設置httponly標誌對會話cookie至關重要,因為它能有效防止XSS攻擊,保護用戶會話信息。具體來說,1)httponly標誌阻止JavaScript訪問cookie,2)在PHP和Flask中可以通過setcookie和make_response設置該標誌,3)儘管不能防範所有攻擊,但應作為整體安全策略的一部分。

PHP會議在網絡開發中解決了什麼問題?PHP會議在網絡開發中解決了什麼問題?May 03, 2025 am 12:02 AM

phpsessions solvathepromblymaintainingStateAcrossMultipleHttpRequestsbyStoringDataTaNthEserVerAndAssociatingItwithaIniquesestionId.1)他們儲存了AtoredAtaserver side,通常是Infilesordatabases,InseasessessionIdStoreDistordStoredStoredStoredStoredStoredStoredStoreDoreToreTeReTrestaa.2)

可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

See all articles

熱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

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

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器