我怎样才能只允许使用 Graphene 的白名单查询?
How can I only allow whitelisted queries with Graphene?
查看 Graphene 以提供 public API,如果您天真地遵循文档中的示例,那么提供一个容易受到攻击的 API 会相对容易拒绝服务攻击,即使它们不是故意的:
- 未分页查询可能 return 数据过多。
- 过深的查询,甚至可能是循环查询,可能会导致数据库中的连接过多。
出于这个原因,我倾向于说保护 public GraphQL API 的最简单方法是在生产环境中建立一个查询白名单。如果查询不在白名单中,并且用户不是管理员,则拒绝查询。
所以,这就引出了一个问题:如何在 Graphene 中维护一个查询白名单并拒绝不在该白名单中的查询?一些想法:
- Graphene 之上的 WSGI 中间件:这是有问题的,因为它会涉及解析 gql 查询以确定它是否真的被列入白名单。那是石墨烯的工作,所以它不是首发。
- 石墨烯中间件。这仍然太细化了; Graphene 的中间件似乎不是每个查询 运行 一次,而是每个查询 节点一次 。所以这也不是一个好的解决方案。
因此,在不尝试深入研究猴子修补石墨烯的情况下,我遇到了同样的问题:如何使用石墨烯实现查询白名单? (或者,我应该如何保护生产 Graphene 服务器免受过于昂贵的查询?)
Graphene 中间件实际上是我会(并且我确实)用于此类需求的。它是细粒度的,但这是有原因的——整个 GraphQL 在设计时就考虑到了细粒度。另外,我不确定您所说的 运行 每个查询一次 是什么意思。查询字段很重要,如果您的意思是要将顶级字段列入白名单,中间件非常适合。 Serving over HTTP - you leave the authentication to the HTTP layer (e.g. using JWT) and authorization to the GraphQL middleware. This is also one of the usage examples from Graphene documentation.
中也间接建议了这种做法
查看 Graphene 以提供 public API,如果您天真地遵循文档中的示例,那么提供一个容易受到攻击的 API 会相对容易拒绝服务攻击,即使它们不是故意的:
- 未分页查询可能 return 数据过多。
- 过深的查询,甚至可能是循环查询,可能会导致数据库中的连接过多。
出于这个原因,我倾向于说保护 public GraphQL API 的最简单方法是在生产环境中建立一个查询白名单。如果查询不在白名单中,并且用户不是管理员,则拒绝查询。
所以,这就引出了一个问题:如何在 Graphene 中维护一个查询白名单并拒绝不在该白名单中的查询?一些想法:
- Graphene 之上的 WSGI 中间件:这是有问题的,因为它会涉及解析 gql 查询以确定它是否真的被列入白名单。那是石墨烯的工作,所以它不是首发。
- 石墨烯中间件。这仍然太细化了; Graphene 的中间件似乎不是每个查询 运行 一次,而是每个查询 节点一次 。所以这也不是一个好的解决方案。
因此,在不尝试深入研究猴子修补石墨烯的情况下,我遇到了同样的问题:如何使用石墨烯实现查询白名单? (或者,我应该如何保护生产 Graphene 服务器免受过于昂贵的查询?)
Graphene 中间件实际上是我会(并且我确实)用于此类需求的。它是细粒度的,但这是有原因的——整个 GraphQL 在设计时就考虑到了细粒度。另外,我不确定您所说的 运行 每个查询一次 是什么意思。查询字段很重要,如果您的意思是要将顶级字段列入白名单,中间件非常适合。 Serving over HTTP - you leave the authentication to the HTTP layer (e.g. using JWT) and authorization to the GraphQL middleware. This is also one of the usage examples from Graphene documentation.
中也间接建议了这种做法