2

每个人如何跨关系进行身份验证以防止数据通过关系被遍历?

例如,我们有一个拥有用户的商店。

// Returns error as i've set custom resolver to allow only context.user.is_shop_owner
{
  shops {
    name
    users {
      email
      ...
    }
  }
}

此查询通常被自定义解析器(如)阻止context.user.is_shop_owner,因此您无法从根查询执行此操作。

但是,如果一个恶意的人遍历关系到达用户对象,他就能够获取敏感的用户数据。

// Data exposed un-intendedly due to relation traversal. How to prevent this?
{
  products {
    name
    price
    shop {
      users { ... } // boom, exposed
    }
  }
}

这是graphql的缺陷吗?你们是如何解决这个问题的

顺便说一句,这是在 python-graphene 堆栈上。

编辑:顺便说一句,我知道我们可以做到exclude_fields,但是我将无法从 ShopNode 访问用户,这是查询 ShopNode 的重要信息,因此限制字段可能不是一个好主意。(已编辑)

4

2 回答 2

2

我最终为每个节点设置了自定义解析器,以阻止您希望基于context.user. 请参阅下面的代码来回答我上面的问题。

class ProductNode(DjangoObjectType):
    class Meta:
        model = Product
        interfaces = (graphene.relay.Node)
        # Exclude nodes where you do not need any access at all
        exclude_fields = ['users']

    # For nodes where you need specific/limited access, define custom resolvers.
    # This prevents the relation traversal loophole
    def resolve_shop(self, args, context, info):
        """ Allow access to nodes only for staff or shop owner and manager """
        if get_is_staff_user(context.user, self):
            return self.shop

        Operations.raise_forbidden_access_error()
于 2017-10-10T04:26:40.603 回答
2

这可能应该在Shop类型内控制,null当用户没有正确的权限时返回。否则,如果Shop从第二个字段访问 a ,则必须重复检查。

于 2017-09-22T17:47:19.377 回答