python - 如何只允许使用 Graphene 进行白名单查询?
问题描述
看着 Graphene 提供一个公共 API,如果你天真地遵循记录的示例,那么提供一个容易受到拒绝服务攻击的 API 会相对容易,即使它们不是故意的:
- 未分页的查询可能会返回太多数据。
- 过深的查询,甚至可能是循环查询,可能会导致数据库连接过多。
出于这个原因,我倾向于说保护公共 GraphQL API 的最简单方法是在生产环境中创建一个查询白名单。如果查询不在白名单中,并且用户不是管理员,则拒绝查询。
所以,这就引出了一个问题:如何在 Graphene 中维护一个查询白名单并拒绝不在该白名单上的查询?一些想法:
- 基于 Graphene 的 WSGI 中间件:这是有问题的,因为它会涉及解析 gql 查询以确定它是否真的被列入白名单。那是 Graphene 的工作,所以它不是首发。
- 石墨烯中间件。这仍然太细化了;Graphene 的中间件似乎不是在每个查询中运行一次,而是在查询上的每个节点运行一次。所以这也不是一个好的解决方案。
因此,在没有尝试深入研究猴子修补石墨烯的情况下,我留下了同样的问题:如何使用石墨烯实现查询白名单?(或者,或者,我应该如何保护生产石墨烯服务器免受过于昂贵的查询?)
解决方案
石墨烯中间件实际上是我会(而且我会)用于这种要求的。它是细粒度的,但有一个原因 - 整个 GraphQL 的设计都考虑到了粒度。另外,我不确定每个查询运行一次是什么意思。查询字段是最重要的,如果您想将顶级字段列入白名单,中间件非常适合。Serving over HTTP中也间接建议了这种做法——您将身份验证留给 HTTP 层(例如使用 JWT),将授权留给 GraphQL 中间件。这也是Graphene 文档中的使用示例之一。
推荐阅读
- php - 如何从 VBA 向 PHP 脚本发送参数
- php - 如何将sql表条目移动到不同的表
- android - 首选网络模式从 2G 回落到 3G
- angular - 如何在角度 6 中多次打印单个按钮?
- google-cloud-platform - GoogleJsonResponseException 代码:403:调用者没有权限
- python - 使用 Matplotlib 更新图像
- python - 形状为 (687, 809) 的目标数组被传递为形状 (None, 25) 的输出,同时用作损失`binary_crossentropy
- javascript - Chart.js 不同时间数据集
- azure - 使用代码服务器进行远程 VS Code 开发
- java - Install4j8对空搜索序列的处理改变了