标准答案

  1. 为每个接口定义允许筛选、排序和返回的字段白名单,并将外部参数映射为受控的查询构造逻辑。
  2. 分页大小、页数、时间范围、关键词长度、数组数量和排序方向都应有上限,避免单次查询消耗过多 CPU、内存或数据库资源。
  3. 排序字段应限制为已设计索引和业务确实需要的列;字段选择也应避免让调用方读取敏感列或大对象字段。
  4. 复杂筛选条件应使用结构化参数或受控 DSL,而不是接受任意 SQL、任意正则、任意 JSONPath 或动态脚本。
  5. 参数校验通过后仍要执行数据权限和租户范围约束,不能因为查询条件合法就允许跨范围读取。

题目解析

任意排序和过滤不仅有注入风险,还可能绕过索引导致全表扫描。接口设计需要同时考虑安全、成本和查询计划。

字段白名单应是领域接口的一部分,而不是通用 ORM 的透传能力。不同角色可见字段和可查字段也可能不同。

常见误区

  • 把 sort 参数原样拼接到 ORDER BY。
  • 允许调用方通过 fields=* 获取内部状态、密钥标识或大字段。
  • 只校验参数类型,不限制范围和查询复杂度。

作者信息