GraphQL 检查看哪几面
GraphQL 把接口收敛到一个端点,好处是灵活,代价是安全控制点也集中了:自省开启等于把 schema 全貌交出去;缺少查询深度与复杂度限制,一条嵌套查询就能压垮服务端;缺少批量限制,一次请求可以携带大量操作,让限速形同虚设。字段级授权是另一个盲区——对象能查不代表每个字段都能查。检查以配置与限制验证为主,不做数据抽取。
基本信息
| 配置面 | 自省开关、调试控制台暴露、字段级授权 |
|---|---|
| 防护面 | 查询深度限制、复杂度限制、批量操作数限制、限速 |
| 端点确认 | 常见路径为 /graphql、/gql、/api/graphql |
| 检查纪律 | 只验证配置与限制,不做数据抽取与穷举 |
| 修复方向 | 生产关闭自省或加鉴权,补齐深度、复杂度与批量限制 |
典型使用场景
- 前后端分离系统的接口安全评审
- 评估是否存在拒绝服务风险(深层嵌套与批量操作)
- 核查字段级授权:不同角色能否读到不该读的字段
- 评估错误信息是否泄露内部实现细节
- 修复验证:确认限制已生效且自省已关闭或需鉴权
核查要点
核查要点
1. 检查自省是否开启(生产环境建议关闭或加鉴权)
2. 提交深层嵌套查询,观察是否被深度限制拦截
3. 提交多操作批量请求,观察批量限制与限速是否生效
4. 用不同角色的测试账号查询同一字段,观察字段级授权
5. 记录:端点、配置现象、缺失的限制项,不导出业务数据现象与判断
| 现象 | 含义 | 处置 |
|---|---|---|
| 自省查询返回完整 schema | 接口全貌对外可见 | 建议关闭自省或加鉴权 |
| 深层嵌套查询正常执行 | 缺少深度限制 | 评估拒绝服务风险并提建议 |
| 批量请求全部执行 | 缺少批量与复杂度限制 | 限速可被绕过,属防护缺失 |
| 低权限角色可读管理字段 | 字段级授权缺失 | 列缺陷,按数据敏感度定级 |
字段级授权是 GraphQL 常见盲区:越权问题要在 schema 层面按对象与字段逐个核查,而不是只看端点级权限。
不要用自省结果做全面字段枚举测试:那会明显偏离授权范围,也容易造成大量数据读取与业务压力。