【问题标题】:Prevent repeated queries in Apollo Server 2防止 Apollo Server 2 中的重复查询
【发布时间】:2018-11-01 21:04:35
【问题描述】:

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

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

也许我没有从正确的角度看待整个事情,所以如果您有任何建议,这将是一个很大的帮助。

谢谢

【问题讨论】:

    标签: security graphql apollo-server


    【解决方案1】:

    最简单的解决方案是实现某种限速中间件。一个使用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 和查询字段名称(例如),您可以使用 graphql-tag 解析请求正文并生成相应的键。

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

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

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

    【讨论】:

    • 我使用了密钥req.ip + gql'${req.body.query}',它运行良好。感谢您的详细回答和其他建议
    猜你喜欢
    • 2011-01-17
    • 2019-03-23
    • 1970-01-01
    • 2022-01-26
    • 2019-10-26
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多