談PHP弱型別安全問題
這篇文章小編想和大家談談PHP弱類型,PHP弱類型給程式設計師書寫程式碼帶來了很大的便利,但是任何事物都有兩面性,現在隨著小編一起了解一下吧。
0x00 弱型別初探
#沒有人質疑php的簡單強大,它提供了許多特性供開發者使用,其中一個就是弱類型機制。
在弱型別機制下 你能夠執行這樣的操作
<?php $var = 1; $var = array(); $var = "string"; ?>
php不會嚴格檢驗傳入的變數型別,也可以將變數自由的轉換型別。
例如在$a == $b的比較中
$a = null; $b = false; //为真 $a = ''; $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 == '0'); // true var_dump(0 == 'abcdefg'); // true var_dump(0 === 'abcdefg'); // false var_dump(1 == '1abcdef'); // true
當有一個對比參數是整數的時候,會把另一個參數強制轉換為整數。
相當於對字串部分
intval再和整數部分比較,其實也就是改變了zval.type的內容尤為注意的是,'1assd'的轉換後的值是1 ,而'asdaf'是0
也說明了intval會從第一位不是數字的單位開始進行
所有也有
var_dump(intval('3389a'));//输出3389
這個例子就告訴我們,永遠不要相信下面的程式碼
if($a>1000){ mysql_query('update ... .... set value=$a') }
你以為這時候進入該支的萬無一失為整數了
其實$a可能是1001/**/union...
#cp.2 語句條件的鬆散判斷
舉例php的switch使用了鬆散比較. $which會被自動intval變成0如果每個case裡面沒有break ,就會一直執行到包含,最終執行到我們需要的函數,這裡是成功包含
<?php if (isset($_GET['which'])) { $which = $_GET['which']; switch ($which) { case 0: case 1: case 2: require_once $which.'.php'; break; default: echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', 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 = 'asdfgh';//字符串类型的a</br> echo $a[2]; //根据php的offset 会输出'd'</br> echo $a[x]; //根据php的预测,这里应该是int型,那么输入string,就会被intval成为0 也就是输出'a'
當陣列遇上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
>0 - 如果string1大於string2
這裡的strcmp函數其實是將兩個變數轉換成ascii 然後做數學減法,傳回一個int的差值。
也就是說鍵入'a'和'a'進行比較得到的結果就是0
那麼如果讓$array和‘a’比較呢?
http://localhost:8888/1.php?a[]=1 var_dump(strcmp($_GET[a],'a'));
這時候php回傳了null!
也就是說,我們讓這個函數出錯從而使它恆真,繞過函數的檢查。
0x04時時防備弱型別
#身為程式設計師,弱型別確實為程式設計師書寫程式碼帶來了很大的便利,但也讓程式設計師忘記了$array =array();的習慣。都說一切輸入都是有害的
那麼其實可以說一切輸入的類型也是可疑的,永遠不要相信弱類型的php下任何比較函數,任何數學運算。否則,你絕對是被php出賣的那一個。
相關教學:PHP影片教學
#以上是談PHP弱型別安全問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
