filter_input 请求参数怎么配置或排查
来源:17golang原创
时间:2026-09-13 04:33:42 363浏览 收藏
接收分页、筛选或表单字段时,filter_input 最容易错的不是函数名,而是把“参数没传”和“参数传了但校验失败”当成同一种情况。实战中可以先用 INPUT_GET 或 INPUT_POST 指定来源,再用明确的校验过滤器和 options 限定范围;默认的 FILTER_DEFAULT 实际上等同于不做过滤。
官方地址:https://www.php.net/manual/en/function.filter-input.php
filter_input(type, var_name, filter, options)的四个位置分别对应输入源、字段名、过滤器和过滤选项。- 读取整数不要只写默认过滤器,优先使用
FILTER_VALIDATE_INT并设置min_range、max_range。 - 未提交通常得到
null,校验失败通常得到false;需要区分语义时不要直接强转成字符串。
先把 filter_input 的四个参数对齐
我排查这类问题时会先把调用拆成四个问题:数据来自哪个输入源?字段实际叫什么?要验证什么规则?规则需要哪些选项?函数签名可以记成:
['min_range' => 1, 'max_range' => 100],
]);
?>
INPUT_GET 只表示查询字符串来源,var_name 是字段名,不是字段值。第四个参数既可以是过滤器支持的选项数组,也可以直接传标志位。把 $_GET['page'] 改成另一个值后再调用 filter_input,不能用来测试修改后的值,因为它读取的是 SAPI 提供的原始输入;已经在 PHP 代码中加工过的变量应改用 filter_var。

用校验过滤器给请求参数设边界
“能读到值”不等于“值可用于业务”。分页参数适合用 FILTER_VALIDATE_INT,而不是依赖字符串转换。下面的写法把缺省页设为 1,同时拒绝 0、负数、小数和超出范围的输入:
['default' => 1, 'min_range' => 1, 'max_range' => 100]]
);
// 只有验证成功后才把结果交给分页查询。
if ($page === false) {
http_response_code(400);
exit('page 参数必须是 1 到 100 的整数');
}
echo $page;
?>
这里的 default 只负责过滤器未通过时的替代值,团队如果需要区分“没传”和“传错”,就不要把默认值放进这一层,而应先保留返回状态再决定响应。校验过滤器也不是输出编码工具:渲染到 HTML 时仍要按输出上下文使用 htmlspecialchars 等编码方式。
为什么会同时出现 null、false 和合法值
这个返回值三分法是排查的关键。没有名为 page 的参数时,函数返回 null;参数存在但整数校验失败时,通常返回 false;通过校验时才是整数结果。不要写成 (int) filter_input(...) 后再判断,因为强转会把多个异常情况压成 0。
| 状态 | 默认结果 | 处理建议 |
|---|---|---|
| 参数未提交 | null | 可采用业务默认值,或要求客户端补齐 |
| 参数存在但校验失败 | false | 返回 400 或提示参数格式错误 |
| 参数通过校验 | 合法整数 | 进入分页、查询等业务逻辑 |
如果项目约定“缺失”和“失败”必须反过来表达,也可以加上 FILTER_NULL_ON_FAILURE:此时变量缺失返回 false,过滤失败返回 null。它改变的是失败值的编码,不会把非法字符串变成合法整数。

四个现场检查点能定位大多数问题
- 来源错:表单用 POST 却写了
INPUT_GET,结果会一直是缺失状态。 - 字段错:HTML 的
name="current_page"与代码里的page不一致,函数不会按你想的字段读取。 - 数组错:参数形如
page[]=1时,标量整数过滤会失败;确实允许数组时要明确使用数组相关 flag,并逐项校验。 - 数据已改:如果先给
$_GET['page']补默认值,再调用filter_input,看到的仍可能是原始请求状态;改用filter_var处理已经拿到的变量。
['min_range' => 1, 'max_range' => 100],
]);
?>
相关问题
filter_input 默认会自动清洗字符串吗?
不会。FILTER_DEFAULT 是 FILTER_UNSAFE_RAW 的别名,不能把它当作安全校验或 HTML 输出编码。
为什么返回 0 会让排查变难?
因为把 null 或 false 强转为整数后,缺失、失败与真实的 0 可能失去区别。应先使用严格比较判断返回状态。
什么时候应该用 filter_input_array?
需要一次读取多个字段且每个字段都有明确规则时可以使用它;单个字段排障时,filter_input 更容易看清每个参数的作用。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
288 收藏
-
132 收藏
-
201 收藏
-
107 收藏
-
文章 · php教程 | 6小时前 | PHP · curl · HTTP客户端 · 连接复用 · 安全边界 · php Curl curl_share_init_persistent CURL_LOCK_DATA_DNS CURL_LOCK_DATA_CONNECT132 收藏
-
251 收藏
-
246 收藏
-
476 收藏
-
234 收藏
-
文章 · php教程 | 12小时前 | session · php教程 · 会话安全 · php SessionHandlerInterface session.use_strict_mode validateId269 收藏
-
486 收藏
-
367 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习