如何防止GraphQL/Apollo服务器上的嵌套攻击?
如何通过以下查询防止针对Apollo服务器的嵌套攻击:如何防止GraphQL/Apollo服务器上的嵌套攻击?,graphql,graphql-js,apollo,Graphql,Graphql Js,Apollo,如何通过以下查询防止针对Apollo服务器的嵌套攻击: { authors { firstName posts { title author { firstName posts{ title author { firstName posts { title [n author]
{
authors {
firstName
posts {
title
author {
firstName
posts{
title
author {
firstName
posts {
title
[n author]
[n post]
}
}
}
}
}
}
}
换句话说,如何限制查询中提交的递归数?这可能是一个潜在的服务器漏洞 在撰写本文时,GraphQL JS或Apollo Server中还没有一个内置的功能来处理这个问题,但随着GraphQL变得越来越流行,它肯定会有一个简单的解决方案。这个问题可以在堆栈的多个级别上通过多种方法解决,并且还应该始终与速率限制相结合,这样人们就不会向您的服务器发送太多的查询(这也是REST的一个潜在问题) 我将列出我能想到的所有不同的方法,并且我将努力使这个答案保持最新,因为这些解决方案在各种GraphQL服务器中实现。其中有些相当简单,有些更复杂
这些是补充验证阶段的自定义规则。查询白名单的一个变体是查询签名 在构建过程中,每个查询都使用一个与服务器共享但不与客户端绑定的秘密进行加密签名。然后在运行时,服务器可以验证查询是否真实
与白名单相比,在客户机中编写查询不需要对服务器进行任何更改。如果多个客户端访问同一服务器(例如web、桌面和移动应用程序),这一点尤其重要。对于您可以使用的查询成本限制
这是一个验证规则,它在执行查询之前解析查询。在GraphQL服务器中,您只需为所需架构类型映射的每个字段分配一个成本配置。不要错过出色的响应。您知道有什么工具可以检测GraphQL中的循环依赖关系吗?我还要强调,另一个大问题是记忆力衰退。Posts->Author->Post层次结构中更深的每一层都是一个乘数(即1个Author拥有5个Posts->5个authors拥有25个Posts->25个authors拥有125个Posts,等等),它不仅将SQL/查询复合到基础数据源,还将堆分配复合到发送回响应。几个级别的深度很容易耗尽几GB的RAM,并使服务器完全崩溃。1个查询可以删除V8!我认为这是(2)和(3)将有帮助的地方。首先,您可以简单地限制单个查询对数据库的请求量(有点像超时)。第二,您可以让您的服务器在生产环境中只接受预先批准的查询,请参阅此处了解更多详细信息:注意:GraphQL Ruby内置了查询深度和复杂性分析器。我不确定其他语言的实现。