詳解PHP intval()函數(shù)的實(shí)例用法
intval() 函數(shù)可以獲取變量的「整數(shù)值」。常用于強(qiáng)制類(lèi)型轉(zhuǎn)換。
語(yǔ)法
int intval( $var, $base )
參數(shù)
- $var:需要轉(zhuǎn)換成 integer 的「變量」
- $base:轉(zhuǎn)換所使用的「進(jìn)制」
返回值
返回值為 integer 類(lèi)型,可能是 0 或 1 或 其他integer 值。
- 0:失敗 或 空array 返回 0
- 1:非空array 返回 1
- 其他integer值:成功時(shí) 返回 $var 的 integer 值。
返回值的「最大值」取決于系統(tǒng)
- 32 位系統(tǒng)(-2147483648 到 2147483647)
- 64 位系統(tǒng)(-9223372036854775808到9223372036854775807)
一、進(jìn)制自動(dòng)轉(zhuǎn)換
第二個(gè)參數(shù) $base 允許為空。
當(dāng) base 為空時(shí),默認(rèn)值是 0,會(huì)根據(jù) $var 的格式來(lái)調(diào)整轉(zhuǎn)換的進(jìn)制。
- 如果 $var 以 0 開(kāi)頭,就使用 8進(jìn)制
- 如果 $var 以0x開(kāi)頭,就使用 16進(jìn)制
- 否則,就使用 10進(jìn)制
實(shí)例:
# 10的 8進(jìn)制是12 var_dump(intval(012)); # 10的 16進(jìn)制是A var_dump(intval(0xA)); # 10的 10進(jìn)制是10 var_dump(intval(10));
輸出:
int(10)
int(10)
int(10)
繞過(guò)思路:當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以使用它的 8進(jìn)制/16進(jìn)制來(lái)繞過(guò)。
二、轉(zhuǎn)換數(shù)組
intval() 轉(zhuǎn)換數(shù)組類(lèi)型時(shí),不關(guān)心數(shù)組中的內(nèi)容,只判斷數(shù)組中有沒(méi)有元素。
- 「空數(shù)組」返回 0
- 「非空數(shù)組」返回 1
實(shí)例:
var_dump(intval(array())); var_dump(intval(array(3,2)));
輸出:
int(0)
int(1)
如果傳入的 $var是數(shù)組中的某個(gè)值時(shí),則當(dāng)做變量來(lái)轉(zhuǎn)換,而不是當(dāng)做數(shù)組類(lèi)型。
實(shí)例:
$arr1 = array(8,6); var_dump(intval($arr1[0]));
輸出:
int(8)
繞過(guò)思路:對(duì)于弱比較(a==b),可以給a、b兩個(gè)參數(shù)傳入空數(shù)組,使弱比較為true。
三、轉(zhuǎn)換小數(shù)
intval() 轉(zhuǎn)換小數(shù)類(lèi)型時(shí),只返回個(gè)位數(shù),不遵循四舍五入的原則。
實(shí)例:
var_dump(intval(12)); var_dump(intval(1.2)); var_dump(intval(1.9));
輸出:
int(12)
int(1)
int(1)
繞過(guò)思路:當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以給它增加小數(shù)位來(lái)繞過(guò)。
四、轉(zhuǎn)換字符串
intval() 轉(zhuǎn)換字符串類(lèi)型時(shí),會(huì)判斷字符串是否以數(shù)字開(kāi)頭
- 如果以數(shù)字開(kāi)頭,就返回1個(gè)或多個(gè)連續(xù)的數(shù)字
- 如果以字母開(kāi)頭,就返回0
單雙引號(hào)對(duì)轉(zhuǎn)換結(jié)果沒(méi)有影響,并且 0 或 0x 開(kāi)頭也只會(huì)當(dāng)做普通字符串處理。
實(shí)例:
var_dump(intval('12abc'));
var_dump(intval("12abc"));
var_dump(intval('abc123'));
var_dump(intval('1a2b3c'));
var_dump(intval('0101'));
var_dump(intval("0x2b"));輸出:
int(12)
int(12)
int(0)
int(1)
int(101)
int(0)
五、取反~
intval() 函數(shù)支持一些特殊符號(hào)的,比如~取反。
實(shí)例:
var_dump(intval(~10)); var_dump(intval(~~10));
輸出:
int(-11)
int(10)
繞過(guò)思路:當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以?xún)纱稳》磥?lái)繞過(guò)。
六、算數(shù)運(yùn)算符
intval() 函數(shù)支持算數(shù)運(yùn)算符,如果傳入的 $var參數(shù)包含算數(shù)運(yùn)算符,會(huì)先運(yùn)算,再對(duì)運(yùn)算結(jié)果進(jìn)行轉(zhuǎn)換。
實(shí)例:
var_dump(intval(5*5)); var_dump(intval(5+5)); var_dump(intval(05+5));
輸出:
int(25)
int(10)
int(10)
繞過(guò)思路:當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以使用算數(shù)運(yùn)算符繞過(guò)。
七、浮點(diǎn)數(shù)精度缺失問(wèn)題
由于PHP中的浮點(diǎn)數(shù)是「弱類(lèi)型」,存在「精度丟失」的問(wèn)題,在轉(zhuǎn)換時(shí)可能會(huì)出現(xiàn)意料之外的情況。
比如下面這個(gè)案例,第一個(gè)輸出34正常,第二個(gè)以為會(huì)輸出58,結(jié)果輸出了57。
實(shí)例:
var_dump(intval(0.34*100.0)); var_dump(intval(0.58*100.0));
輸出:
int(34)
int(57)
八、intval()繞過(guò)思路
最后匯總一下intval()函數(shù)漏洞的繞過(guò)思路:
1)當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以使用它的 8進(jìn)制/16進(jìn)制來(lái)繞過(guò);比如過(guò)濾10,就用012(八進(jìn)制)或0xA(十六進(jìn)制)。
2)對(duì)于弱比較(a==b),可以給a、b兩個(gè)參數(shù)傳入空數(shù)組,使弱比較為true。
3)當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以給它增加小數(shù)位來(lái)繞過(guò);比如過(guò)濾3,就用3.1。
4)當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以給它拼接字符串來(lái)繞過(guò);比如過(guò)濾3,就用3ab。(GET請(qǐng)求的參數(shù)會(huì)自動(dòng)拼接單引號(hào))
5)當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以?xún)纱稳》磥?lái)繞過(guò);比如過(guò)濾10,就用~~10。
6)當(dāng)某個(gè)數(shù)字被過(guò)濾時(shí),可以使用算數(shù)運(yùn)算符繞過(guò);比如過(guò)濾10,就用 5+5 或 2*5。
以上就是詳解PHP intval()函數(shù)的實(shí)例用法的詳細(xì)內(nèi)容,更多關(guān)于PHP intval()函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP編碼規(guī)范-php coding standard
標(biāo)準(zhǔn)化問(wèn)題在某些方面上讓每個(gè)人頭痛,讓人人都覺(jué)得大家處于同樣的境地。這有助于讓這些建議在許多的項(xiàng)目中不斷演進(jìn),許多公司花費(fèi)了許多星期逐子字逐句的進(jìn)行爭(zhēng)論。2007-03-03
一個(gè)php短網(wǎng)址的生成代碼(仿微博短網(wǎng)址)
這篇文章主要介紹了一個(gè)php短網(wǎng)址的生成代碼(仿微博短網(wǎng)址),需要的朋友可以參考下2014-05-05
php中print(),print_r(),echo()的區(qū)別詳解
本文介紹了php函數(shù)print(),print_r(),echo()的區(qū)別,這里推薦給大家,需要的朋友可以參考下2014-12-12
封裝一個(gè)PDO數(shù)據(jù)庫(kù)操作類(lèi)代碼
數(shù)據(jù)庫(kù)PDO操作類(lèi),網(wǎng)上好多朋友需要的,可以參考下。2009-09-09
PHP實(shí)現(xiàn)會(huì)員賬號(hào)單唯一登錄的方法分析
這篇文章主要介紹了PHP實(shí)現(xiàn)會(huì)員賬號(hào)單唯一登錄的方法,結(jié)合實(shí)例形式分析了php基于session與文件讀寫(xiě)的單一用戶(hù)登陸限制實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03
Laravel實(shí)現(xiàn)隊(duì)列的示例代碼
這篇文章主要為大家詳細(xì)介紹了Laravel實(shí)現(xiàn)隊(duì)列的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)游戲2023-02-02

