詳解PHP intval()函數(shù)的實例用法
intval() 函數(shù)可以獲取變量的「整數(shù)值」。常用于強制類型轉換。
語法
int intval( $var, $base )
參數(shù)
- $var:需要轉換成 integer 的「變量」
- $base:轉換所使用的「進制」
返回值
返回值為 integer 類型,可能是 0 或 1 或 其他integer 值。
- 0:失敗 或 空array 返回 0
- 1:非空array 返回 1
- 其他integer值:成功時 返回 $var 的 integer 值。
返回值的「最大值」取決于系統(tǒng)
- 32 位系統(tǒng)(-2147483648 到 2147483647)
- 64 位系統(tǒng)(-9223372036854775808到9223372036854775807)
一、進制自動轉換
第二個參數(shù) $base 允許為空。
當 base 為空時,默認值是 0,會根據(jù) $var 的格式來調整轉換的進制。
- 如果 $var 以 0 開頭,就使用 8進制
- 如果 $var 以0x開頭,就使用 16進制
- 否則,就使用 10進制
實例:
# 10的 8進制是12 var_dump(intval(012)); # 10的 16進制是A var_dump(intval(0xA)); # 10的 10進制是10 var_dump(intval(10));
輸出:
int(10)
int(10)
int(10)
繞過思路:當某個數(shù)字被過濾時,可以使用它的 8進制/16進制來繞過。
二、轉換數(shù)組
intval() 轉換數(shù)組類型時,不關心數(shù)組中的內(nèi)容,只判斷數(shù)組中有沒有元素。
- 「空數(shù)組」返回 0
- 「非空數(shù)組」返回 1
實例:
var_dump(intval(array())); var_dump(intval(array(3,2)));
輸出:
int(0)
int(1)
如果傳入的 $var是數(shù)組中的某個值時,則當做變量來轉換,而不是當做數(shù)組類型。
實例:
$arr1 = array(8,6); var_dump(intval($arr1[0]));
輸出:
int(8)
繞過思路:對于弱比較(a==b),可以給a、b兩個參數(shù)傳入空數(shù)組,使弱比較為true。
三、轉換小數(shù)
intval() 轉換小數(shù)類型時,只返回個位數(shù),不遵循四舍五入的原則。
實例:
var_dump(intval(12)); var_dump(intval(1.2)); var_dump(intval(1.9));
輸出:
int(12)
int(1)
int(1)
繞過思路:當某個數(shù)字被過濾時,可以給它增加小數(shù)位來繞過。
四、轉換字符串
intval() 轉換字符串類型時,會判斷字符串是否以數(shù)字開頭
- 如果以數(shù)字開頭,就返回1個或多個連續(xù)的數(shù)字
- 如果以字母開頭,就返回0
單雙引號對轉換結果沒有影響,并且 0 或 0x 開頭也只會當做普通字符串處理。
實例:
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ù)支持一些特殊符號的,比如~
取反。
實例:
var_dump(intval(~10)); var_dump(intval(~~10));
輸出:
int(-11)
int(10)
繞過思路:當某個數(shù)字被過濾時,可以兩次取反來繞過。
六、算數(shù)運算符
intval() 函數(shù)支持算數(shù)運算符,如果傳入的 $var參數(shù)包含算數(shù)運算符,會先運算,再對運算結果進行轉換。
實例:
var_dump(intval(5*5)); var_dump(intval(5+5)); var_dump(intval(05+5));
輸出:
int(25)
int(10)
int(10)
繞過思路:當某個數(shù)字被過濾時,可以使用算數(shù)運算符繞過。
七、浮點數(shù)精度缺失問題
由于PHP中的浮點數(shù)是「弱類型」,存在「精度丟失」的問題,在轉換時可能會出現(xiàn)意料之外的情況。
比如下面這個案例,第一個輸出34正常,第二個以為會輸出58,結果輸出了57。
實例:
var_dump(intval(0.34*100.0)); var_dump(intval(0.58*100.0));
輸出:
int(34)
int(57)
八、intval()繞過思路
最后匯總一下intval()函數(shù)漏洞的繞過思路:
1)當某個數(shù)字被過濾時,可以使用它的 8進制/16進制來繞過;比如過濾10,就用012(八進制)或0xA(十六進制)。
2)對于弱比較(a==b),可以給a、b兩個參數(shù)傳入空數(shù)組,使弱比較為true。
3)當某個數(shù)字被過濾時,可以給它增加小數(shù)位來繞過;比如過濾3,就用3.1。
4)當某個數(shù)字被過濾時,可以給它拼接字符串來繞過;比如過濾3,就用3ab。(GET請求的參數(shù)會自動拼接單引號)
5)當某個數(shù)字被過濾時,可以兩次取反來繞過;比如過濾10,就用~~10。
6)當某個數(shù)字被過濾時,可以使用算數(shù)運算符繞過;比如過濾10,就用 5+5 或 2*5。
以上就是詳解PHP intval()函數(shù)的實例用法的詳細內(nèi)容,更多關于PHP intval()函數(shù)的資料請關注腳本之家其它相關文章!
相關文章
自己寫的兼容低于PHP 5.5版本的array_column()函數(shù)
這篇文章主要介紹了自己寫的兼容低于PHP 5.5版本的array_column()函數(shù),array_column是PHP 5.5新增函數(shù),有時在低版本中也可能要用到,需要的朋友可以參考下2014-10-10