Python 如何仅允许使用Graphene的白名单查询?
让Graphene提供一个公共API,如果您天真地遵循文档中的示例,那么提供一个容易受到拒绝服务攻击的API将相对容易,即使这些攻击不是故意的:Python 如何仅允许使用Graphene的白名单查询?,python,graphene-python,Python,Graphene Python,让Graphene提供一个公共API,如果您天真地遵循文档中的示例,那么提供一个容易受到拒绝服务攻击的API将相对容易,即使这些攻击不是故意的: 未经处理的查询可能返回太多数据 过于深入的查询,甚至可能是循环查询,可能会导致数据库中的连接过多 出于这个原因,我倾向于说,保护公共GraphQLAPI的最简单方法是在生产中有一个查询白名单。如果查询不在白名单中,并且用户不是管理员,请拒绝查询 因此,这就引出了一个问题:如何在石墨烯中维护一个查询白名单,并拒绝不在该白名单上的查询?一些想法: G
- 未经处理的查询可能返回太多数据
- 过于深入的查询,甚至可能是循环查询,可能会导致数据库中的连接过多
- Graphene之上的WSGI中间件:这是有问题的,因为它需要解析gql查询以确定它是否真的是白名单。这是石墨烯的工作,所以这不是第一步
- 石墨烯中间件。这还是太零碎了;Graphene的中间件似乎不是每个查询运行一次,而是每个查询节点运行一次。所以这也不是一个好的解决方案
因此,在不深入研究猴子修补石墨烯的情况下,我只剩下一个问题:如何使用石墨烯实现查询白名单?(或者,我应该如何保护生产Graphene服务器不受过于昂贵的查询的影响?Graphene中间件实际上是我将(而且我确实)用于此类需求的。它是粒度的,但有一个原因——整个GraphQL的设计考虑了粒度。另外,我不知道你说的每个查询运行一次是什么意思。查询字段才是最重要的,如果您想将顶级字段列入白名单,那么中间件非常适合这样做。在中也间接建议了这种做法-将身份验证留给HTTP层(例如,使用JWT),将授权留给GraphQL中间件。这也是中的一个使用示例