<p>filter_input() 本身不执行过滤,仅调用 filter_var() 支持的过滤器,如 FILTER_VALIDATE_EMAIL、FILTER_SANITIZE_NUMBER_INT 等;PHP 8.1 起多数 FILTERSANITIZE* 已弃用,推荐改用 filter_var($val, FILTER_SANITIZE_SPECIAL_CHARS) 或手动处理。</p>

PHP 中 filter_input() 支持哪些过滤器?
直接看结论:filter_input() 本身不执行过滤,它只是个入口函数,真正干活的是背后的 filter_var() 过滤器族。支持的过滤方法完全取决于你传给它的 $filter 参数值,常见有 FILTER_SANITIZE_STRING(已废弃)、FILTER_VALIDATE_EMAIL、FILTER_SANITIZE_NUMBER_INT 等。
注意:PHP 8.1 起大量 FILTER_SANITIZE_* 类过滤器已被弃用,改用 filter_var($val, FILTER_SANITIZE_SPECIAL_CHARS) 或手动正则/类型转换更稳妥。
-
FILTER_VALIDATE_URL:校验是否为合法 URL 格式(但不检查域名是否存在) -
FILTER_VALIDATE_FLOAT:允许带小数点和科学计数法,但会把"1e5"当作有效浮点数 -
FILTER_SANITIZE_EMAIL:只保留字母、数字、@、.、_、-,别指望它能防 SQL 注入 - 自定义过滤必须用
filter_var()+FILTER_CALLBACK,filter_input()不支持直接传匿名函数
Node.js 里没有 filter_input(),该用什么替代?
Node.js 原生无对应函数,得靠组合:解析请求体(如 express.urlencoded() / express.json())后,对 req.body 或 req.query 手动调用验证库或原生方法。
常见错误是直接信任 req.query.id 并传给数据库查询——它本质是字符串,哪怕看起来像数字,也可能被注入恶意字符。
- 数字参数优先用
Number(req.query.page)+isNaN()判断,别用parseInt()(会截断"123abc") - 邮箱用正则
/^[^\s@]+@[^\s@]+\.[^\s@]+$/粗筛,再交由 SMTP 验证(如nodemailer的verify()) - 路径参数(
req.params.slug)建议白名单匹配:/^[a-z0-9\-]{3,32}$/i,避免../或空格绕过 - 不要在过滤时修改原始对象(如
req.query = {...}),中间件顺序错乱会导致后续逻辑读到脏数据
request.getParameter() 在 Java Servlet 中怎么过滤?
Servlet API 本身不提供过滤能力,request.getParameter() 返回的就是原始字符串,所有过滤必须手动做。很多人误以为加了 @WebServlet 注解就自动过滤了,其实完全没有。
容易踩的坑是:在 DAO 层才做校验,导致非法输入已进入业务逻辑,甚至触发 NPE 或日志污染。
- 推荐在 Controller 层用
StringUtils.trimToNull(request.getParameter("name"))(Apache Commons)先去空再判空 - 数字类参数立刻转
Long.parseLong()或Integer.valueOf(),捕获NumberFormatException返回 400 - HTML 标签过滤不能只靠
StringEscapeUtils.escapeHtml4(),它不处理 JavaScript 事件属性(如onerror),需配合Jsoup.clean() - 敏感词过滤别用
String.replace(),要防止"<code>admin" →"<code>adm in" 绕过,应统一转小写 + 正则边界匹配
Go 的 r.FormValue() 和 gorilla/schema 怎么安全取参?
r.FormValue() 返回 string,和 Java 一样裸奔;gorilla/schema 可结构体绑定,但默认不做类型过滤,比如 int 字段传入 "abc" 会静默设为 0,而非报错。
关键点在于:Go 没有“过滤器注册表”概念,每个字段的校验逻辑必须显式写,靠第三方库(如 go-playground/validator)补足。
- 用
validator时,type User struct { Name string `validate:"required,min=2,max=20"` },但注意required不等价于非空字符串——" "仍会通过 - 数字参数别信
json.Unmarshal的自动转换,前端传{"age": "25"}和{"age": 25}都可能,得统一用strconv.Atoi()处理 - 文件上传参数(
r.MultipartForm.Value)必须单独校验,validator默认不覆盖这部分 - 所有从
r.URL.Query()、r.PostForm、r.MultipartForm取出的值,默认都未做 XSS 过滤,渲染前务必html.EscapeString()
最常被忽略的是:不同框架对空字符串、零值、缺失字段的处理策略完全不同,比如 Go 的 schema 把空字符串当零值跳过赋值,而 PHP 的 filter_input() 会返回 null。不统一约定,联调时参数莫名消失就很难定位。










