如何使用以下查询阻止对Apollo服务器的嵌套攻击:
{
authors {
firstName
posts {
title
author {
firstName
posts{
title
author {
firstName
posts {
title
[n author]
[n post]
}
}
}
}
}
}
}
换句话说,如何限制查询中提交的递归次数?这可能是潜在的服务器漏洞。
答案 0 :(得分:48)
截至撰写本文时,GraphQL-JS或Apollo Server中没有内置功能来处理这一问题,但随着GraphQL变得越来越流行,它肯定会有一个简单的解决方案。这个问题可以通过堆栈的多个层次上的几种方法来解决,并且还应该始终与速率限制相结合,以便人们不能向您的服务器发送太多查询(这也是REST的潜在问题)。
我将列出我能想到的所有不同方法,并且我会尽力使这个答案保持最新,因为这些解决方案是在各种GraphQL服务器中实现的。其中一些很简单,有些更复杂。
(1)和(2)特别是默认情况下每个GraphQL服务器都应具有的功能,特别是因为许多新开发人员可能不会意识到这些问题。 (3)仅适用于某些类型的应用程序,但在有非常严格的性能或安全要求时可能是一个不错的选择。
答案 1 :(得分:11)
为了补充stubailo的答案中的第(4)点,这里有一些Node.js实现,它们对传入的GraphQL文档施加成本和深度边界。
这些是补充验证阶段的自定义规则。
答案 2 :(得分:3)
查询白名单的变体是查询签名。
在构建过程中,使用与服务器共享但未与客户端捆绑的密钥对每个查询进行加密签名。然后在运行时,服务器可以验证查询是否为正版。
与白名单相比,优势在于在客户端编写查询并不需要对服务器进行任何更改。如果多个客户端访问同一服务器(例如,Web,桌面和移动应用程序),这一点尤为重要。
答案 3 :(得分:2)
对于查询费用限制,您可以使用graphql-cost-analysis
这是一个验证规则,可在执行查询之前解析查询。在GraphQL服务器中,您只需为所需的模式类型映射的每个字段分配成本配置。
答案 4 :(得分:1)
Don't miss graphql-rate-limit a GraphQL directive to add basic but granular rate limiting to your Queries or Mutations.