詳解PHP intval()函數(shù)的實(shí)例用法
intval() 函數(shù)可以獲取變量的「整數(shù)值」。常用于強(qiáng)制類型轉(zhuǎn)換。
語法
int intval( $var, $base )
參數(shù)
- $var:需要轉(zhuǎn)換成 integer 的「變量」
- $base:轉(zhuǎn)換所使用的「進(jìn)制」
返回值
返回值為 integer 類型,可能是 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 的格式來調(diào)整轉(zhuǎn)換的進(jìn)制。
- 如果 $var 以 0 開頭,就使用 8進(jìn)制
- 如果 $var 以0x開頭,就使用 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)
繞過思路:當(dāng)某個(gè)數(shù)字被過濾時(shí),可以使用它的 8進(jìn)制/16進(jìn)制來繞過。
二、轉(zhuǎn)換數(shù)組
intval() 轉(zhuǎn)換數(shù)組類型時(shí),不關(guān)心數(shù)組中的內(nèi)容,只判斷數(shù)組中有沒有元素。
- 「空數(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)做變量來轉(zhuǎn)換,而不是當(dāng)做數(shù)組類型。
實(shí)例:
$arr1 = array(8,6); var_dump(intval($arr1[0]));
輸出:
int(8)
繞過思路:對于弱比較(a==b),可以給a、b兩個(gè)參數(shù)傳入空數(shù)組,使弱比較為true。
三、轉(zhuǎn)換小數(shù)
intval() 轉(zhuǎn)換小數(shù)類型時(shí),只返回個(gè)位數(shù),不遵循四舍五入的原則。
實(shí)例:
var_dump(intval(12)); var_dump(intval(1.2)); var_dump(intval(1.9));
輸出:
int(12)
int(1)
int(1)
繞過思路:當(dāng)某個(gè)數(shù)字被過濾時(shí),可以給它增加小數(shù)位來繞過。
四、轉(zhuǎn)換字符串
intval() 轉(zhuǎn)換字符串類型時(shí),會(huì)判斷字符串是否以數(shù)字開頭
- 如果以數(shù)字開頭,就返回1個(gè)或多個(gè)連續(xù)的數(shù)字
- 如果以字母開頭,就返回0
單雙引號對轉(zhuǎn)換結(jié)果沒有影響,并且 0 或 0x 開頭也只會(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ù)支持一些特殊符號的,比如~
取反。
實(shí)例:
var_dump(intval(~10)); var_dump(intval(~~10));
輸出:
int(-11)
int(10)
繞過思路:當(dāng)某個(gè)數(shù)字被過濾時(shí),可以兩次取反來繞過。
六、算數(shù)運(yùn)算符
intval() 函數(shù)支持算數(shù)運(yùn)算符,如果傳入的 $var參數(shù)包含算數(shù)運(yùn)算符,會(huì)先運(yùn)算,再對運(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)
繞過思路:當(dāng)某個(gè)數(shù)字被過濾時(shí),可以使用算數(shù)運(yùn)算符繞過。
七、浮點(diǎn)數(shù)精度缺失問題
由于PHP中的浮點(diǎn)數(shù)是「弱類型」,存在「精度丟失」的問題,在轉(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()繞過思路
最后匯總一下intval()函數(shù)漏洞的繞過思路:
1)當(dāng)某個(gè)數(shù)字被過濾時(shí),可以使用它的 8進(jìn)制/16進(jìn)制來繞過;比如過濾10,就用012(八進(jìn)制)或0xA(十六進(jìn)制)。
2)對于弱比較(a==b),可以給a、b兩個(gè)參數(shù)傳入空數(shù)組,使弱比較為true。
3)當(dāng)某個(gè)數(shù)字被過濾時(shí),可以給它增加小數(shù)位來繞過;比如過濾3,就用3.1。
4)當(dāng)某個(gè)數(shù)字被過濾時(shí),可以給它拼接字符串來繞過;比如過濾3,就用3ab。(GET請求的參數(shù)會(huì)自動(dòng)拼接單引號)
5)當(dāng)某個(gè)數(shù)字被過濾時(shí),可以兩次取反來繞過;比如過濾10,就用~~10。
6)當(dāng)某個(gè)數(shù)字被過濾時(shí),可以使用算數(shù)運(yùn)算符繞過;比如過濾10,就用 5+5 或 2*5。
以上就是詳解PHP intval()函數(shù)的實(shí)例用法的詳細(xì)內(nèi)容,更多關(guān)于PHP intval()函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
laravel 實(shí)現(xiàn)設(shè)置時(shí)區(qū)的簡單方法
今天小編就為大家分享一篇laravel 實(shí)現(xiàn)設(shè)置時(shí)區(qū)的簡單方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10PHP實(shí)現(xiàn)頁面跳轉(zhuǎn)的多種方法
PHP被許多程序員用來開發(fā)WEB的首選語言,在實(shí)際開發(fā)中,網(wǎng)站的各項(xiàng)功能都可以通過PHP語言的編寫來滿足,比如PHP頁面跳轉(zhuǎn)這一方法,本文給大家介紹了PHP實(shí)現(xiàn)頁面跳轉(zhuǎn)的多種方法,需要的朋友可以參考下2024-10-10PHP實(shí)現(xiàn)簡單實(shí)用的分頁類代碼
這篇文章主要介紹了PHP實(shí)現(xiàn)簡單實(shí)用的分頁類代碼,結(jié)合實(shí)例形式分析了PHP分頁類的定義與使用技巧,非常簡單實(shí)用,需要的朋友可以參考下2016-04-04PHP用戶管理中常用接口調(diào)用實(shí)例及解析(含源碼)
本文主要介紹了PHP用戶管理中常用接口調(diào)用實(shí)例及解析(含源碼),具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03php頁面跳轉(zhuǎn)代碼 輸入網(wǎng)址跳轉(zhuǎn)到你定義的頁面
我先判斷一下你是否開啟了https,如果是就正常的https頁面,如果沒有開始則跳轉(zhuǎn)到項(xiàng)目的目錄下面,感興趣的朋友可以參考下哈,希望對你有所幫助2013-03-03自己寫的兼容低于PHP 5.5版本的array_column()函數(shù)
這篇文章主要介紹了自己寫的兼容低于PHP 5.5版本的array_column()函數(shù),array_column是PHP 5.5新增函數(shù),有時(shí)在低版本中也可能要用到,需要的朋友可以參考下2014-10-10