防止 Apollo Server 2 中的重复查询

Prevent repeated queries in Apollo Server 2

出于安全原因,我正在寻找一种方法来阻止不良行为者一遍又一遍地在服务器上发送重复查询,因为这可能会导致执行性能不佳 and/or 高部署价格。

Apollo Server Documentation中有一个link如何使用KeyValueCache实现我们自己的缓存后端,但我不确定如何使用它来防止重复运行 多次查询。

可能是我看问题的角度不对,如果大家有什么建议,希望对大家有帮助。

谢谢

最简单的解决方案是实施某种限速中间件。使用 express-rate-limit

的简单示例
const server = new ApolloServer({ typeDefs, resolvers })
const app = express()

const limitMiddleware = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 100,
})

app.use(limitMiddleware)
server.applyMiddleware({ app })

app.listen({ port: 4000 })

默认情况下,中间件关闭请求 IP,但如果您想要更细化并关闭 IP 和查询字段名称(例如),您可以使用 [=11 解析请求正文=] 并相应地生成密钥。

GraphQL 在安全方面提出了一些独特的挑战。您可以查看 this article 以获得更深入的讨论,但除了限速之外,您可能还想了解以下措施:

  1. 数量限制 - 在存储级别使用限制,使用自定义标量或在解析器内部实施检查以防止一次返回太多 "thing"
  2. 查询深度限制 - graphql-depth-limit
  3. 限制一般查询的复杂性和成本 - graphql-validation-complexitygraphql-cost-analysis

虽然这些工具不一定能解决您问题中的情况,但在您深入研究如何保护端点时,我仍会考虑使用它们的某种组合。