首页/开发/系统分析与架构设计速查/过滤、排序与字段选择

过滤、排序与字段选择

集合接口的查询能力:过滤条件、排序字段与字段裁剪(fields/select);参数要白名单化并限制复杂度,避免把数据库查询能力暴露成攻击面。

集合接口的查询能力

集合接口通常要支持三类查询参数:过滤条件(哪些记录)、排序字段(按什么顺序)和字段选择(返回哪些字段)。这三类能力一旦开放给调用方,就等于把一部分查询能力暴露出去,因此每个参数都必须白名单化、限制复杂度,并明确默认值与上限。设计目标是让调用方能表达常见筛选需求,同时不给数据库和搜索引擎制造昂贵查询与注入面。

基本信息

过滤?status=paid&created_after=2026-01-01,字段白名单
排序?sort=-created_at,前缀减号表示倒序
字段裁剪?fields=id,status 减少载荷与耦合
分页游标分页比偏移分页更适合深分页与实时数据

典型使用场景

  • 后台管理列表:按状态、时间区间、负责人筛选并排序
  • 对账与导出:按条件拉取明细,字段裁剪降低传输量
  • 移动端列表:只取渲染需要的字段,减少载荷与解析开销
  • 第三方开放接口:对外提供受限的查询能力,避免暴露内部字段
  • 数据同步:按更新时间增量拉取,配合游标推进

接口与实现要点

接口与实现要点
GET /v1/orders?status=paid&created_after=2026-01-01&sort=-created_at&fields=id,status,total&limit=50

实现侧:
- status 走枚举白名单校验,非法值直接 400
- created_after 走时间格式校验,不接受任意表达式
- sort 字段与方向都走白名单,禁止按未索引字段排序
- fields 只允许出现在公开字段清单里
# 每个过滤字段都应对应一个可用索引,否则列表页会成为慢查询来源

参数风险与对策

参数常见风险对策
过滤条件组合出昂贵查询或无索引扫描字段白名单 + 索引核对 + 组合数量上限
排序排序字段无索引导致临时表与全表排序排序字段白名单,单独维护索引
字段选择裁剪字段暴露内部字段名与敏感数据公开字段清单,敏感字段永不进入清单
分页参数偏移分页在深页时扫过大量行改用游标分页,限制单页大小上限

使用要点

  • 过滤与排序字段走白名单映射,绝不把调用方输入直接拼进查询语句
  • 参数上限定为显式数值:单页大小、时间跨度、过滤条件个数都要有上限
  • 默认返回字段要克制:默认只返回稳定且公开的字段,其余按需请求
  • 对外接口的查询能力与内部接口分开:内部可以更宽,对外必须收敛
  • 为每个新增的过滤与排序字段补索引与压测验证,再放行到接口
参数直接拼接进 SQL 或转发给搜索引擎会造成注入与资源耗尽;必须走白名单与绑定参数,并把限制写在接口契约里而不是只靠代码评审。
过滤能力的设计要与数据模型同步演进:新增状态字段时同步更新白名单与索引,否则调用方会用“全量拉取再本地过滤”的方式绕过限制。

易错点

  • 过滤字段不设白名单,被利用生成昂贵查询,把数据库拖慢甚至拖垮
  • 默认返回全量字段,载荷膨胀且暴露内部字段名,后续难以再收回
  • 排序参数允许任意字段,未加索引的排序造成全表扫描
  • 偏移分页在深页时仍需扫描大量记录,接口在大数据量下越来越慢
  • 限制只在文档里说明而代码未校验,调用方超限使用后平台被迫承担成本

数据来源与参考

  • Google API 设计指南:Standard Query Parameters
  • OWASP API Security Top 10(2023)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌