标准答案
- 为每个接口定义允许筛选、排序和返回的字段白名单,并将外部参数映射为受控的查询构造逻辑。
- 分页大小、页数、时间范围、关键词长度、数组数量和排序方向都应有上限,避免单次查询消耗过多 CPU、内存或数据库资源。
- 排序字段应限制为已设计索引和业务确实需要的列;字段选择也应避免让调用方读取敏感列或大对象字段。
- 复杂筛选条件应使用结构化参数或受控 DSL,而不是接受任意 SQL、任意正则、任意 JSONPath 或动态脚本。
- 参数校验通过后仍要执行数据权限和租户范围约束,不能因为查询条件合法就允许跨范围读取。
题目解析
任意排序和过滤不仅有注入风险,还可能绕过索引导致全表扫描。接口设计需要同时考虑安全、成本和查询计划。
字段白名单应是领域接口的一部分,而不是通用 ORM 的透传能力。不同角色可见字段和可查字段也可能不同。
常见误区
- 把 sort 参数原样拼接到 ORDER BY。
- 允许调用方通过 fields=* 获取内部状态、密钥标识或大字段。
- 只校验参数类型,不限制范围和查询复杂度。