详解PHP intval()函数的实例用法
作者:士别三日wyx
intval() 函数可以获取变量的「整数值」。常用于强制类型转换。
语法
int intval( $var, $base )
参数
- $var:需要转换成 integer 的「变量」
- $base:转换所使用的「进制」
返回值
返回值为 integer 类型,可能是 0 或 1 或 其他integer 值。
- 0:失败 或 空array 返回 0
- 1:非空array 返回 1
- 其他integer值:成功时 返回 $var 的 integer 值。
返回值的「最大值」取决于系统
- 32 位系统(-2147483648 到 2147483647)
- 64 位系统(-9223372036854775808到9223372036854775807)
一、进制自动转换
第二个参数 $base 允许为空。
当 base 为空时,默认值是 0,会根据 $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)
绕过思路:当某个数字被过滤时,可以使用它的 8进制/16进制来绕过。
二、转换数组
intval() 转换数组类型时,不关心数组中的内容,只判断数组中有没有元素。
- 「空数组」返回 0
- 「非空数组」返回 1
实例:
var_dump(intval(array())); var_dump(intval(array(3,2)));
输出:
int(0)
int(1)
如果传入的 $var是数组中的某个值时,则当做变量来转换,而不是当做数组类型。
实例:
$arr1 = array(8,6); var_dump(intval($arr1[0]));
输出:
int(8)
绕过思路:对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。
三、转换小数
intval() 转换小数类型时,只返回个位数,不遵循四舍五入的原则。
实例:
var_dump(intval(12)); var_dump(intval(1.2)); var_dump(intval(1.9));
输出:
int(12)
int(1)
int(1)
绕过思路:当某个数字被过滤时,可以给它增加小数位来绕过。
四、转换字符串
intval() 转换字符串类型时,会判断字符串是否以数字开头
- 如果以数字开头,就返回1个或多个连续的数字
- 如果以字母开头,就返回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() 函数支持一些特殊符号的,比如~
取反。
实例:
var_dump(intval(~10)); var_dump(intval(~~10));
输出:
int(-11)
int(10)
绕过思路:当某个数字被过滤时,可以两次取反来绕过。
六、算数运算符
intval() 函数支持算数运算符,如果传入的 $var参数包含算数运算符,会先运算,再对运算结果进行转换。
实例:
var_dump(intval(5*5)); var_dump(intval(5+5)); var_dump(intval(05+5));
输出:
int(25)
int(10)
int(10)
绕过思路:当某个数字被过滤时,可以使用算数运算符绕过。
七、浮点数精度缺失问题
由于PHP中的浮点数是「弱类型」,存在「精度丢失」的问题,在转换时可能会出现意料之外的情况。
比如下面这个案例,第一个输出34正常,第二个以为会输出58,结果输出了57。
实例:
var_dump(intval(0.34*100.0)); var_dump(intval(0.58*100.0));
输出:
int(34)
int(57)
八、intval()绕过思路
最后汇总一下intval()函数漏洞的绕过思路:
1)当某个数字被过滤时,可以使用它的 8进制/16进制来绕过;比如过滤10,就用012(八进制)或0xA(十六进制)。
2)对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。
3)当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。
4)当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。(GET请求的参数会自动拼接单引号)
5)当某个数字被过滤时,可以两次取反来绕过;比如过滤10,就用~~10。
6)当某个数字被过滤时,可以使用算数运算符绕过;比如过滤10,就用 5+5 或 2*5。
以上就是详解PHP intval()函数的实例用法的详细内容,更多关于PHP intval()函数的资料请关注脚本之家其它相关文章!