参数校验是API安全的第一道关卡。绝大多数安全漏洞都源于对输入参数校验不严格。严格的参数校验可以防御SQL注入、XSS攻击、命令注入等常见攻击手段。同时,良好的参数校验还能提升API的易用性,及时给出明确的错误提示。本文分享企业级参数校验方案。
基础校验规则
每个API参数都要定义明确的校验规则。类型校验:参数是否是预期的数字、字符串、布尔值或枚举值。长度校验:字符串最小和最大长度。格式校验:邮箱、手机号、URL、IP地址等正则校验。范围校验:数字的最小值和最大值。必填校验:哪些参数是必需的。这些基础校验应该在框架层面统一实现,每个API只需要声明规则即可。
业务规则校验
业务规则校验比基础校验复杂。例如:创建订单时校验商品库存是否充足、用户余额是否足够、优惠券是否过期。业务校验通常在Service层完成,校验失败时抛出业务异常。分组校验允许在不同场景下使用不同的校验规则,如创建时的必填字段和更新时的可选字段。跨字段校验涉及多个参数的组合逻辑,需要在类级别定义校验器。
校验异常处理
参数校验失败需要给出友好的错误提示。错误信息应该指明哪个参数校验失败以及失败原因。国际化支持:根据请求头中的Accept-Language返回对应语言的错误信息。错误响应格式统一:{ field: 参数名, message: 错误描述, code: 错误码 }。批量参数校验时,收集所有错误信息一次返回,避免客户端多次请求。安全考虑:校验错误不要暴露数据库表结构或内部实现细节。
框架选型与实现
Java生态推荐Bean Validation标准(JSR 380)配合Hibernate Validator。Spring Boot集成后使用@Valid或@Validated注解触发校验。自定义校验注解可以复用到多个接口。Node.js使用Joi或express-validator。Python使用Pydantic或marshmallow。Go使用validator库。无论使用哪种框架,核心原则不变:在边界处校验、校验失败快速失败、错误信息明确。