PHP Intval()函数特性绕过方式
函数特性
intval()
函数通过使用指定的进制base(默认是10进制),返回变量的整数值。此外,该函数不能用于object,否则会报错E_NOTICE
并返回1。
简要来说,该函数用来获取变量的整数值,常用于强制类型转换
语法:
1 | int intval($var, $base) |
参数解释:
$var
:需要转换为整数的变量$base
:转换所需使用的进制(非必填)
返回值:
所有返回值均为整数类型,可能为0,1或者其他整数
- 0:转换失败或为空
- 1:非空数组,返回1
- 其他整数值,当运算成功时,返回
$var
的整值
进制自动转换
第二个$base
值允许为空,默认为0,它会根据$var
的进制来自动调整
- 若
$var
是以0开头的,就使用8进制 - 若
$var
是以0x开头的,就使用16进制 - 否则使用10进制
样例:
1 |
|
输出结果:
1 | 10 |
利用思路:当某个数字被过滤时,可以考虑使用它的八进制或十六进制绕过
数组转换
intval()
转换数组类型时,不关心数组中的内容,只判断数组中有没有元素。
- 空数组返回0
- 非空返回1
样例:
1 |
|
输出结果:
1 | int(0) |
当传入的是数组中的某个值的时候,就当作变量来转换,不是数组类型
样例:
1 |
|
输出结果:
1 | int(1) |
利用思路:对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。
小数转换
intval()
转换小数类型时,只返回个位数,不遵循四舍五入的原则,直接取整。
样例:
1 |
|
输出结果:
1 | int(1) |
利用思路:当某个数字被过滤时,可以给它增加小数位来绕过。
字符串转换
intval()
转换字符串类型时,会判断字符串是否以数字开头
- 如果以数字开头,就返回1个或多个连续的数字
- 如果以字母开头,就返回0
[!NOTE]
注:单双引号对转换结果没有影响,并且以0或者0x开头的也只会被当作字符串来处理
样例:
1 |
|
输出结果:
1 | int(456) |
利用思路:当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。
取反~
intval()
函数支持一些特殊操作,例如~
取反
样例:
1 |
|
输出结果:
1 | int(-11) |
利用思路:当某个数字被过滤时,可以使用两次取反绕过
算术运算
intval()
函数支持算数运算符,如果传入的 $var参数包含算数运算符,会先运算,再对运算结果进行转换。
样例:
1 |
|
输出结果:
1 | int(10) |
利用思路:当某个数字被过滤时,可以使用运算符号来计算得到,实现绕过
浮点数精度缺失问题
PHP中的浮点数为弱类型,有精度丢失的问题,在转换时可能会出现一些问题:
样例:
1 |
|
输出结果:
1 | int(34) |
第一个结果正确,第二个精度丢失,本来是58,输出则变成了57
- 标题: PHP Intval()函数特性绕过方式
- 作者: 耀鳞光翼
- 创建于 : 2025-01-02 23:27:00
- 更新于 : 2025-01-02 23:27:22
- 链接: https://blog.lightwing.top/2025/01/02/php_intval/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。