PHP数字转换缺陷
- 当赋值给PHP变量的整型超过PHP的最大值PHP_INT_MAX时,PHP将无法计算出正确结果,攻击者可能会利用其跳过某些校验逻辑,如密码校验(无须输入正确的密码就可以直接登录用户的账号)、账号充值校验(充值很小的金额就可以进行巨额资金入账)等
<?php
$a = 92233720368547758079223372036854775807;
$b = 92233720368547758079223372036854775819;
$aa = '92233720368547758079223372036854775807';
$bb = '92233720368547758079223372036854775819';
var_dump($a===$b);// 输出bool(true)
var_dump($a%100);// 输出int(0)
var_dump($b%100);// 输出int(0)
var_dump($aa===$bb);// 输出bool(false)
var_dump($aa%100);// 输出int(7)
var_dump($bb%100);// 输出int(7)
-
在实际的业务逻辑中(如充值金额、订单数量),一定要对最大值进行限制,避免数据越界而导致错误的执行结果。
- PHP_INT_MAX:
- 32位系统:(2^31)-1
- 64位系统:(2^63)-1
此处只列举了int型,其它数值型也存在类似问题。