用途:该技能用于对 GraphQL API 进行安全审计,当用户提及 GraphQL、查询深度、自省(introspection)、批量请求滥用、字段级授权等话题时触发。GraphQL 的灵活性(任意查询、嵌套遍历、批量操作)带来 REST 中不存在的攻击面,需要逐项显式缓解。
主要能力与做法:
- 生产环境关闭自省:自省会暴露完整 schema,示例包括 Apollo Server 的 introspection: process.env.NODE_ENV !== 'production'、@envelop/disable-introspection 插件,以及 graphql-js 中手写校验规则拦截 __schema 与 __type。例外是预发环境可在鉴权后保留,或用持久化查询锁定 schema 面。
- 查询深度限制:深度嵌套查询会在超时前耗尽内存,可用 graphql-depth-limit 设置 depthLimit(7),多数 schema 合理范围 5–10,建议先测出真实最深查询再留 2 层余量。
- 查询复杂度限制:仅靠深度无法覆盖宽查询,可用 graphql-query-complexity 的 createComplexityRule 按字段估算成本,在 schema 上用 @complexity 标注昂贵字段及 multipliers。
- 批量请求滥用:单个 HTTP 请求可携带多个操作,可关闭 Apollo Server 的 allowBatchedHttpRequests,或用自定义插件限制批量大小。
- 字段级授权:路由级鉴权不足以保护嵌套字段,需在每个敏感字段 resolver 内鉴权,或用 graphql-shield 声明式规则(如 and(isAuthenticated, isOwner))。
- N+1 与数据暴露:无 DataLoader 时嵌套查询产生 N+1 数据库命中,也是 DoS 向量,用 DataLoader 批量化,既是正确性修复也是安全修复。
- 非显性向量:__typename 是否计入深度、别名绕过速率限制、订阅中 mutations、错误信息泄漏 schema、文件上传端点绕过查询校验、未强制持久化查询等,并给出错误掩码示例与审计清单。
限制:资料仅给出上述缓解思路与代码示例,未说明具体适用范围、性能开销、版本兼容性、收费或平台信息;落地时需按自身 schema 与框架评估,其余暂未提供。