PHP Intval()函数特性绕过方式

PHP Intval()函数特性绕过方式

耀鳞光翼 Lv3

函数特性

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
2
3
4
5
<?
echo intval(012); // 10的八进制为012
echo intval(0xA); // 10的十六进制为0xA
echo intval(10); // 10的十进制为10
?>

输出结果:

1
2
3
10
10
10

利用思路:当某个数字被过滤时,可以考虑使用它的八进制或十六进制绕过

数组转换

intval()转换数组类型时,不关心数组中的内容,只判断数组中有没有元素。

  • 空数组返回0
  • 非空返回1

样例:

1
2
3
4
<?
var_dump(intval(array()));
var_dump(intval(array(1,2,3)))
?>

输出结果:

1
2
int(0)
int(1)

当传入的是数组中的某个值的时候,就当作变量来转换,不是数组类型

样例:

1
2
3
4
5
<?
$array1 = array(1.35,2,3);
var_dump(intval($array1[0]))

?>

输出结果:

1
int(1)

利用思路:对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。

小数转换

intval() 转换小数类型时,只返回个位数,不遵循四舍五入的原则,直接取整。

样例:

1
2
3
4
5
<?
var_dump(intval(1.5));
var_dump(intval(15.66));
var_dump(intval(256.32145));
?>

输出结果:

1
2
3
int(1)
int(15)
int(256)

利用思路:当某个数字被过滤时,可以给它增加小数位来绕过。

字符串转换

intval()转换字符串类型时,会判断字符串是否以数字开头

  • 如果以数字开头,就返回1个或多个连续的数字
  • 如果以字母开头,就返回0

[!NOTE]

注:单双引号对转换结果没有影响,并且以0或者0x开头的也只会被当作字符串来处理

样例:

1
2
3
4
5
6
7
<?
var_dump(intval('456abc'));
var_dump(intval('abc456'));
var_dump(intval("456abc"));
var_dump(intval('0456'));
var_dump(intval('0x456'));
?>

输出结果:

1
2
3
4
5
int(456)
int(0)
int(456)
int(456)
int(0)

利用思路:当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。

取反~

intval()函数支持一些特殊操作,例如~取反

样例:

1
2
3
4
5
<?
var_dump(intval(~10));
var_dump(intval(~~10));

?>

输出结果:

1
2
int(-11)
int(10)

利用思路:当某个数字被过滤时,可以使用两次取反绕过

算术运算

intval() 函数支持算数运算符,如果传入的 $var参数包含算数运算符,会先运算,再对运算结果进行转换。

样例:

1
2
3
4
5
6
7
<?
var_dump(intval(5+5));
var_dump(intval(5-5));
var_dump(intval(05*5));
var_dump(intval(5/5));

?>

输出结果:

1
2
3
4
int(10)
int(0)
int(25)
int(1)

利用思路:当某个数字被过滤时,可以使用运算符号来计算得到,实现绕过

浮点数精度缺失问题

PHP中的浮点数为弱类型,有精度丢失的问题,在转换时可能会出现一些问题:

样例:

1
2
3
4
<?
var_dump(intval(0.34*100.0));
var_dump(intval(0.58*100.0));
?>

输出结果:

1
2
int(34)
int(57)

第一个结果正确,第二个精度丢失,本来是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 进行许可。
评论