我如何只允许使用石墨烯的白名单查询?

问题描述 投票:0回答:1

查看Graphene提供的公共API,如果您天真地遵循所记录的示例,提供相对容易遭受拒绝服务攻击的API相对容易,即使它们不是故意的:

  • 分页查询可能返回太多数据。
  • 过度的深度查询,甚至可能是循环查询,都可能导致数据库上的联接过多。

出于这个原因,我倾向于说,保护公共GraphQL API的最简单方法是在生产环境中使用查询白名单。如果查询不在白名单中,并且用户不是管理员,请拒绝查询。

因此,提出了一个问题:如何在Graphene中维护查询白名单并拒绝不在该白名单上的查询?一些想法:

  • 位于Graphene之上的WSGI中间件:这是有问题的,因为它将涉及解析gql查询来确定它是否真的被列入白名单。那是石墨烯的工作,所以这不是入门。
  • 石墨烯中间件。这仍然太详细了; Graphene的中间件似乎不是每个查询运行一次,而是每个查询节点运行一次。因此,这也不是一个好的解决方案。

因此,在不尝试深入研究猴子修补Graphene的情况下,我遇到了相同的问题:如何使用Graphene实现查询白名单? (或者,或者,如何保护生产的Graphene服务器免受过于昂贵的查询呢?)

python graphene-python
1个回答
0
投票
石墨烯中间件实际上就是我(而且我会)用于此类要求的东西。它是粒度的,但是出于一个原因-整个GraphQL的设计都考虑了粒度。另外,我不确定运行

每个查询一次的意思。查询字段很重要,如果您想将顶级字段列入白名单,则中间件非常适合。 Serving over HTTP中也间接建议这种做法-您将身份验证留给HTTP层(例如,使用JWT),将授权留给GraphQL中间件。这也是Graphene documentation中的用法示例之一。

© www.soinside.com 2019 - 2024. All rights reserved.