必须先过滤再转换,因intval()和(int)对非法字符串过于宽容,如”123abc”返回123、”0x1A”解析为26,易导致SQL注入或逻辑漏洞;正确做法是用filter_var($val, FILTER_VALIDATE_INT)校验后再转换。
PHP 表单输入转整型,不能直接 intval() 或强制类型转换完事——必须先过滤,再转换,否则可能绕过校验、引发 SQL 注入或逻辑漏洞。
为什么不能直接 (int) 或 intval()?
因为 intval() 和强制转换对非法字符串“太宽容”:比如 intval("123abc") 返回 123,(int)"123px" 也是 123;更危险的是 intval("0x1A") 解析为十进制 26,而 "1e3" 会被转成 1(科学计数法截断)。这些都不是用户真实意图,却能通过看似“整数”的校验。
常见错误现象:
-
表单提交
id=123%00abc(含空字节)→intval()仍得123,但后续pdo->prepare()绑定时若未严格类型化,可能被用于宽字节注入 -
前端隐藏字段写
→ 后端只用(int)$_POST['status'],结果是1,看似安全,实则掩盖了参数被篡改的事实
正确流程:先 filter_var() 过滤,再确认是否有效
用 filter_var() 的 FILTER_VALIDATE_INT 是最稳妥的起点,它只接受纯整数字符串(可带正负号),拒绝任何后缀、空格、符号混杂。
立即学习“PHP免费学习笔记(深入)”;
实操建议: