资源 · 37
保护 GraphQL API:授权、查询成本和证据
强制执行对象和字段权限、绑定服务器工作并测试拒绝路径。
已更新 · 2 min
本指南有助于实现的目标
- 绘制暴露的模式图
- 执行权限测试
- 绑定查询成本
- 验证拒绝操作
快速检查
- 一个账户能否读取另一个账户的对象?
- 敏感字段是否遵循其父级的访问决策?
- 深度、别名和分页的综合成本是多少?
- 哪些细节会通过错误泄露?
- 谁负责观察拒绝操作和滥用行为?
分步指南
- 1
清点操作
列出类型、字段、变更、角色、对象所有者和敏感数据。 包括当前客户端查询和不常用的路径。
交付成果:操作、角色、对象和字段矩阵。
- 2
测试每个访问决策
创建不同的测试账户并交换对象 ID,包括嵌套对象。 解析器必须在返回数据之前强制执行授权。
交付成果:可复现的允许和拒绝案例。
- 3
绑定服务器工作
测量字段和集合的实际成本。 同时测试深度、广度、别名、分页、批处理和时间,然后设置合适的限制。
交付成果:成本策略和对抗性查询集。
- 4
减少不必要的暴露
决定是否对上下文进行内省,隐藏内部错误详情,并移除超出客户端需求的信息字段。
交付成果:审查公共配置和错误响应。
- 5
谨慎观察
记录有用的技术身份、操作、成本、拒绝和关联信息,同时排除密钥和敏感参数。 分配警报负责人。
交付成果:仪表板和调查流程。
- 6
变更后重放
当字段、角色或客户端发生更改时,重复授权和加载用例。 检查现在遍历已修改图的旧查询。
交付成果:回归测试结果和发布决定。
管理指标
| 指标 | 衡量内容 | 首要行动 |
|---|---|---|
| 访问权限 | 对象和字段案例按预期被拒绝 | 修复解析器 |
| 成本 | 策略限制了高负载查询 | 调整字段和限制 |
| 错误 | 公开响应不包含内部详细信息 | 减少公开详细信息 |
| 回归 | 客户端操作在变更后重放 | 阻止意外破坏 |
常见错误
- 仅信任端点访问
- 限制深度但忽略广度
- 忽略嵌套字段授权
- 记录包含敏感数据的参数
常见问题解答
GraphQL 是否移除了普通 API 授权?
否。每个对象和字段的访问仍然需要基于身份和上下文的决策。
禁用内省是否足够?
否。它可能减少模式暴露,但无法解决访问或查询成本问题。
深度限制是否足够?
否。别名、广度、列表和字段特定成本也很重要。
官方参考文献
参考文献支持该方法。 请根据您的实际情况调整检查;它们并非认证。 原始参考文献标题和源文档可能使用其他语言。






