嵌套解析器的权限校验边界

1 人参与

在 GraphQL 中,用户有权读取父对象,并不意味着有权读取它关联的每个对象或字段。嵌套解析器的权限边界就在这里:父级校验决定能否访问父对象;关联解析器还需依据当前身份、目标对象归属和业务策略,判断这条关系能否被展开;敏感字段则可能需要单独校验。若只在根查询入口检查权限,同一数据经关联关系返回时就可能绕过预期限制。

判断边界时,应把“可访问的对象”和“可访问的关系”分开。某角色可以查看一个测试对象的基本信息,不代表可以顺着关联字段读取另一角色拥有的对象;即使关联对象本身可见,其中的敏感字段也未必可见。因此,授权不能依赖客户端是否展示字段、对象 ID 是否难以猜测,或查询是否从特定入口发起。相同的访问规则应覆盖直接查询和嵌套查询。

验证宜使用专用账号与合成数据:先确认有权角色能够读取目标字段,再保持查询结构不变,切换为无权角色,观察嵌套对象及敏感字段的返回结果。响应为空、报错或请求成功,都不能单独证明权限正确;需要对照预期规则和测试对象归属,必要时结合服务端日志判断。若发现越权,只保留足以复核差异的脱敏证据,不扩大对象或字段范围。

查询深度限制能够约束嵌套查询的资源消耗,却不能代替授权。修复重点应放在解析器或统一服务层:每次解析关联对象和受限字段时执行适用的权限判断,并检查不同查询入口是否一致。复测还要确认有权角色仍能正常访问,避免把“全部返回空值”误当成修复成功。

参与讨论

1 条评论
  • 甜橙小可爱

    嵌套里每个字段都得单独校验

    回复