出于安全考虑,我正在寻找一种方法来阻止不良行为者在服务器上反复发送重复查询,因为这可能会导致执行性能差和/或部署价格高。
在Apollo Server文档中,有一个链接指向如何使用KeyValueCache
实现我们自己的缓存后端,但我不确定如何使用它来防止重复查询多次运行。
也许我没有从正确的角度看待整件事,所以如果你有任何建议,那将是一个很大的帮助。
感谢
最简单的解决方案是实现某种速率限制中间件。使用快速速率限制的一个简单示例
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和查询字段名称进行键控(例如(,则可以使用graphql-tag
解析请求主体,并相应地生成一个键。
GraphQL在安全性方面提出了一些独特的挑战。你可以看看这篇文章进行更深入的讨论,但除了利率限制外,你可能还想研究以下措施:
- 数量限制-在存储级别使用限制,使用自定义标量或在解析器内部实现检查,以防止一次返回太多的一个"东西">
- 查询深度限制-
graphql-depth-limit
- 限制一般查询的复杂性和成本——
graphql-validation-complexity
和graphql-cost-analysis
虽然这些工具不一定能解决您问题中的场景,但在您深入研究如何保护端点时,我仍然会考虑使用它们的组合。