日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 淺談PHP弱類型安全

淺談PHP弱類型安全

來源:程序員人生   發布時間:2015-03-05 08:01:15 閱讀次數:3729次

0x00 弱類型初探


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

在弱類型機制下 你能夠履行這樣的操作

<?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

typedefstruct_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; }; typedefunion_zvalue_value { longlval; /* long value */ doubledval; /* double value */ struct{ char*val; intlen; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value;



其中php通過type判斷變量類型 存入value

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

0x03變量的強迫轉換


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

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

當int遇上string

cp.1 數學運算

當php進行1些數學計算的時候

var_dump(0 == '0'); // true var_dump(0 == 'abcdefg');// true var_dump(0 === 'abcdefg'); // false var_dump(1 == '1abcdef'); // true



當有1個對照參數是整數的時候,會把另外1個參數強迫轉換為整數。

相當于對字符串部份

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

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

所有也有

var_dump(intval('3389a'));//輸出3389



這個例子就告知我們,永久不要相信下面的代碼

if($a>1000){ mysql_query('update ... .... set value=$a') }

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

其實$a多是1001/**/union...

cp.2 語句條件的疏松判斷

舉個例子
php的switch使用了疏松比較. $which會被自動intval變成0
如果每一個case里面沒有break ,就會1直履行到包括,終究履行到我們需要的函數,這里是成功包括

<?php if (isset($_GET['which'])){ $which=$_GET['which']; switch($which) { case0: case1: case2: require_once$which.'.php'; break; default: echoGWF_HTML::error('PHP-0817','Hacker NoNoNo!', false); break; }



cp.3 函數的疏松判斷

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


in_array ― 檢查數組中是不是存在某個值 參數

needle 待搜索的值。

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

strict 如果第3個參數 strict 的值為 TRUE 則 in_array() 函數還會檢查 needle 的類型是不是和 haystack 中的相同。

可以看到,只有加了strict才會對類型進行嚴格比較, 那末我們再次把整形和字符串進行比較呢?

var_dump(in_array("abc",$array1)); var_dump(in_array("1bc",$array2));

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

結果很明顯了

如果array1里面有個值為0,那末第1條返回就會為真//intval('abc')=0

如果array2里面有個值為1,那末第2條就會為真//intval('1bc')=1

array_search也是1樣的原理

這里的利用就很廣泛了,

很多程序員都會檢查數組的值,

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

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

$a = 'asdfgh';//字符串類型的a echo $a[2]; //根據php的offset 會輸出'd'</br>echo $a[x]; <code class="php functions">echo</code> <code class="php variable">$a</code><code class="php plain">[x]</code>;//根據php的預測,這里應當是int型,那末輸入string,就會被intval成為0 也就是輸出'a'


當數組遇上string

這1個例子我是在德國的1個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 然后做數學減法,返回1個int的差值。

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

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

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


這時候候php返回了null!

也就是說,我們讓這個函數出錯從而使它恒真,繞過函數的檢查。
下面給出1張疏松比較的表格


0x04時時防備弱類型


作為1個程序員,弱類型確切給程序員書寫代碼帶來了很大的便利,但是也讓程序員忘記了
$array =array();的習慣。
都說1切輸入都是有害的

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

轉自烏云

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩av首页 | 欧美日韩激情一区 | 中文字幕日韩专区 | 高清视频一区二区 | 99精品国产高清一区二区麻豆 | 日韩电影中文字幕 | 精品久久久久久国产 | 中文字幕在线观看日韩 | 欧美成人精品一区二区三区 | 不卡中文一二三区 | 看全色黄大色黄大片男爽一次 | 欧美a√ | 99这里只有精品视频 | 欧美区一| 31xx视频免费播放 | 国产精品成人一区 | 国产一区二区三区高清视频 | 婷婷成人av| 久久九九久久精品 | av三级在线观看 | 成人欧美一区二区三区 | 亚洲精品乱码久久久久久蜜桃 | 日韩a | 亚洲欧美日韩精品久久亚洲区 | 欧美午夜精品久久久久免费视 | 国产精品久久久久久一级毛片 | 婷婷伊人五月 | 久久免费看片 | 免费在线一区二区 | 日本啊v在线 | 中文字幕在线三区 | 日韩av电影在线免费观看 | 日韩欧美精品在线观看 | 久久久久黄色 | 日韩精品久久久久久久软件91 | 成人精品久久久 | 免费视频三区 | 日韩免费小视频 | 开心成人 | 污污的网站在线观看 | 在线观看污污视频 |