资源 · 37

保护 GraphQL API:授权、查询成本和证据

强制执行对象和字段权限、绑定服务器工作并测试拒绝路径。

已更新 · 2 min

图书馆书架上的互联网和技术书籍 插图 · 虚构场景

本指南有助于实现的目标

  • 绘制暴露的模式图
  • 执行权限测试
  • 绑定查询成本
  • 验证拒绝操作

快速检查

  • 一个账户能否读取另一个账户的对象?
  • 敏感字段是否遵循其父级的访问决策?
  • 深度、别名和分页的综合成本是多少?
  • 哪些细节会通过错误泄露?
  • 谁负责观察拒绝操作和滥用行为?

分步指南

  1. 1

    清点操作

    列出类型、字段、变更、角色、对象所有者和敏感数据。 包括当前客户端查询和不常用的路径。

    交付成果:操作、角色、对象和字段矩阵。

  2. 2

    测试每个访问决策

    创建不同的测试账户并交换对象 ID,包括嵌套对象。 解析器必须在返回数据之前强制执行授权。

    交付成果:可复现的允许和拒绝案例。

  3. 3

    绑定服务器工作

    测量字段和集合的实际成本。 同时测试深度、广度、别名、分页、批处理和时间,然后设置合适的限制。

    交付成果:成本策略和对抗性查询集。

  4. 4

    减少不必要的暴露

    决定是否对上下文进行内省,隐藏内部错误详情,并移除超出客户端需求的信息字段。

    交付成果:审查公共配置和错误响应。

  5. 5

    谨慎观察

    记录有用的技术身份、操作、成本、拒绝和关联信息,同时排除密钥和敏感参数。 分配警报负责人。

    交付成果:仪表板和调查流程。

  6. 6

    变更后重放

    当字段、角色或客户端发生更改时,重复授权和加载用例。 检查现在遍历已修改图的旧查询。

    交付成果:回归测试结果和发布决定。

管理指标

指标衡量内容首要行动
访问权限对象和字段案例按预期被拒绝修复解析器
成本策略限制了高负载查询调整字段和限制
错误公开响应不包含内部详细信息减少公开详细信息
回归客户端操作在变更后重放阻止意外破坏

常见错误

  • 仅信任端点访问
  • 限制深度但忽略广度
  • 忽略嵌套字段授权
  • 记录包含敏感数据的参数

常见问题解答

GraphQL 是否移除了普通 API 授权?

否。每个对象和字段的访问仍然需要基于身份和上下文的决策。

禁用内省是否足够?

否。它可能减少模式暴露,但无法解决访问或查询成本问题。

深度限制是否足够?

否。别名、广度、列表和字段特定成本也很重要。

官方参考文献

参考文献支持该方法。 请根据您的实际情况调整检查;它们并非认证。 原始参考文献标题和源文档可能使用其他语言。