Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何仅允许使用Graphene的白名单查询?_Python_Graphene Python - Fatal编程技术网

Python 如何仅允许使用Graphene的白名单查询?

Python 如何仅允许使用Graphene的白名单查询?,python,graphene-python,Python,Graphene Python,让Graphene提供一个公共API,如果您天真地遵循文档中的示例,那么提供一个容易受到拒绝服务攻击的API将相对容易,即使这些攻击不是故意的: 未经处理的查询可能返回太多数据 过于深入的查询,甚至可能是循环查询,可能会导致数据库中的连接过多 出于这个原因,我倾向于说,保护公共GraphQLAPI的最简单方法是在生产中有一个查询白名单。如果查询不在白名单中,并且用户不是管理员,请拒绝查询 因此,这就引出了一个问题:如何在石墨烯中维护一个查询白名单,并拒绝不在该白名单上的查询?一些想法: G

让Graphene提供一个公共API,如果您天真地遵循文档中的示例,那么提供一个容易受到拒绝服务攻击的API将相对容易,即使这些攻击不是故意的:

  • 未经处理的查询可能返回太多数据
  • 过于深入的查询,甚至可能是循环查询,可能会导致数据库中的连接过多
出于这个原因,我倾向于说,保护公共GraphQLAPI的最简单方法是在生产中有一个查询白名单。如果查询不在白名单中,并且用户不是管理员,请拒绝查询

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

  • Graphene之上的WSGI中间件:这是有问题的,因为它需要解析gql查询以确定它是否真的是白名单。这是石墨烯的工作,所以这不是第一步
  • 石墨烯中间件。这还是太零碎了;Graphene的中间件似乎不是每个查询运行一次,而是每个查询节点运行一次。所以这也不是一个好的解决方案

因此,在不深入研究猴子修补石墨烯的情况下,我只剩下一个问题:如何使用石墨烯实现查询白名单?(或者,我应该如何保护生产Graphene服务器不受过于昂贵的查询的影响?

Graphene中间件实际上是我将(而且我确实)用于此类需求的。它是粒度的,但有一个原因——整个GraphQL的设计考虑了粒度。另外,我不知道你说的每个查询运行一次是什么意思。查询字段才是最重要的,如果您想将顶级字段列入白名单,那么中间件非常适合这样做。在中也间接建议了这种做法-将身份验证留给HTTP层(例如,使用JWT),将授权留给GraphQL中间件。这也是中的一个使用示例