技能 graphql
📦
graphql
安全
构建具备最佳实践的安全 GraphQL API
GraphQL 的灵活性可能导致性能和安全性问题,如果没有适当的控制。本技能提供了 DataLoader 使用、查询深度限制和授权的成熟模式,帮助构建可用于生产的 GraphQL API。
支援: Claude Codex Code(CC)
1
下載技能 ZIP
2
在 Claude 中上傳
前往 設定 → 功能 → 技能 → 上傳技能
3
開啟並開始使用
測試它
正在使用「graphql」。 为电子商务产品目录设计 schema
預期結果:
- 包含 Product、Category 和 Review 类型的 GraphQL schema
- 对 discountPrice 等可选字段的适当空值处理
- 用于产品评论分页的 Connections
- 带有输入类型的 CRUD 操作 mutations
正在使用「graphql」。 修复用户帖子解析器中的 N+1 查询
預期結果:
- 批处理用户 ID 查找的 DataLoader 实现
- 按用户 ID 键入缓存以防止重复查询
- 与 Apollo Server context 集成
- 性能从 N 次查询提升到 1 次批处理查询
安全審計
安全v1 • 2/25/2026
This skill is a documentation file containing GraphQL best practices and patterns. Static analysis flagged false positives: line 69 references related skills (not shell execution), and lines 3, 22, 34, 63, 72 contain markdown content (not cryptographic code). No executable code or security risks detected.
1
已掃描檔案
73
分析行數
0
發現項
1
審計總數
未發現安全問題
審計者: claude
品質評分
38
架構
100
可維護性
87
內容
50
社群
100
安全
91
規範符合性
你能建構什麼
构建新 API 的后端开发者
从零开始设计和实现具有适当性能优化和安全控制的生产就绪 GraphQL API。
集成 GraphQL 的前端团队
为 React 应用程序设置具有标准化缓存和高效数据获取模式的 Apollo Client。
审核现有 API 的技术负责人
识别并修复常见的 GraphQL 反模式,如缺少 DataLoader、无限查询深度和授权漏洞。
試試這些提示
设计基础 GraphQL Schema
为包含 User、Post 和 Comment 类型的博客创建 GraphQL schema。包括适当的空值处理、关系和常见的 CRUD 操作作为 queries 和 mutations。
实现 DataLoader 防止 N+1
我有一个为用户获取帖子的 GraphQL 解析器。每个帖子解析器都进行单独的数据库查询。展示如何实现 DataLoader 来批处理和缓存这些查询。
添加查询深度限制
为我的 Apollo Server 设置查询深度限制和复杂度分析,以防止来自深度嵌套 GraphQL 查询的 DoS 攻击。包括配置和错误处理。
实现字段级授权
展示如何在 GraphQL 解析器中实现字段级授权。某些字段应该只对经过身份验证的用户或具有特定角色的用户可见。
最佳實務
- 始终使用 DataLoader 批处理数据库查询并防止 N+1 问题
- 限制查询深度和复杂度以防护 DoS 攻击
- 在解析器中实现授权,而不仅仅依靠 schema 指令
避免
- 在解析器中直接进行数据库调用而不使用 DataLoader
- 允许 GraphQL 端点上的无限查询深度
- 仅依赖 schema 指令进行授权逻辑
常見問題
为什么 GraphQL 需要 DataLoader?
如果没有 DataLoader,每个字段解析器都会进行独立的数据库查询。单个查询获取 10 篇帖子及其作者会触发 11 次查询(1 次获取帖子,10 次获取作者)。DataLoader 将这些批处理为 2 次查询,显著提高性能。
生产环境中应该启用 introspection 吗?
通常不需要。Introspection 会向客户端暴露整个 schema 结构。虽然对开发工具很有用,但它可以帮助攻击者了解你的 API。除非你特别需要客户端工具支持,否则在生产环境中禁用它。
schema 授权和解析器授权有什么区别?
Schema 指令在类型/字段级别声明谁可以访问什么。解析器授权实现实际逻辑。始终在解析器中实现授权;仅靠指令可能被绕过或配置错误。
如何在 GraphQL 中处理错误与 null 数据?
在 schema 中使用适当的空值处理。如果字段可以为空,将其设为 nullable。如果必须有值,将其设为 non-null。当 non-null 字段失败时,GraphQL 会将整个父对象设为 null,这可能会破坏查询。
我应该使用什么查询深度限制?
大多数 API 从 5-10 的深度限制开始。监控你的合法查询并相应调整。还要实现查询复杂度分析以捕捉绕过深度限制的昂贵但浅层的查询。
我需要清理 GraphQL 订阅吗?
是的。订阅保持开放连接。当客户端断开连接时,确保服务器端订阅处理程序得到适当清理以防止内存泄漏。使用适当的生命周期钩子在订阅解析器中实现清理。