按宽度限制GraphQL查询

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

[许多文章,教程甚至模块可以通过检查查询的深度,成本或对高速率连续请求(DoS攻击)的GraphQL服务器进行速率限制来限制恶意递归查询。

但是,我无法找到任何可以保护GraphQL服务器免受“宽”查询的保护,该查询只是在同一请求中拉出太多字段实例,即:

query MaliciousQuery {
  alias1: fieldName { subfileld1 subfiled2 ...}
  alias2: fieldName { subfileld1 subfiled2 ...}
  ...
  alias10: fieldName { subfileld1 subfiled2 ...}
  ...
  alias100: fieldName { subfileld1 subfiled2 ...}
  ...
  alias1000: fieldName { subfileld1 subfiled2 ...}
  ...
}

是的,GraphQL允许客户询问他们的需求,但是在某些情况下,我们可能希望限制特定类型的对象数量,特别是在获取此类对象的成本很高的情况下。我应该提到在我的用例中不希望使用分页。

当然,一种方法是限制查询字符串的总长度,但这是完成此操作的粗略方法,并且对于甚至不引用实际昂贵对象的复杂查询请求,也会产生意想不到的副作用。成本分析也可以使用,但是对于这种简单的东西来说似乎已经过头了,并且还会引入其他复杂性。

如果我们可以在架构上有一个限制指令,可以在其中指定类似的内容,那就太好了

@perRequestLimit(count: 5)

因此,客户在单个查询中不能请求超过5个这些昂贵的对象。

有人知道这样的模块吗?还是有其他方法可以实现这种限制?

security graphql graphql-js apollo-server express-graphql
2个回答
0
投票

一种更好的方法是简单地使用查询成本或查询复杂性分析。有existing libraries可以解析请求的查询,确定成本并在成本超过设置的允许值时拒绝该请求。这使您可以轻松控制查询的深度和广度,而不必将单个查询“白名单”,因为扩展性不是很好。


0
投票

尽管我认为这应该是GraphQL的核心功能,但似乎不存在这样的模块/实现,尤其是因为这可能是一个很大的DoS漏洞,并且如上所述,在某些情况下,成本/复杂性分析可能会显得过大(就像我们的特定情况一样。

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