每个人如何跨关系进行身份验证以防止数据通过关系遍历?
例如,我们有一个拥有用户的商店。
// 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堆栈btw。
编辑:顺便说一下,我知道我们可以exclude_fields
,但是我将无法从ShopNode访问用户,这是查询ShopNode的重要信息,因此限制字段可能不是一个好主意。 (编辑)的
答案 0 :(得分:2)
这应该在Shop
类型内控制,以便在用户没有正确权限时返回null
。否则,如果从第二个字段访问Shop
,则您必须复制该支票。
答案 1 :(得分:0)
我开始为每个节点设置自定义解析器,以阻止您希望根据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()