如何在服务器上安全地使用 GraphQL

阅读时长 3 分钟读完

GraphQL 是一种查询语言,用于在客户端和服务器之间进行数据交互。它已经逐渐成为前端开发中的热门技术,因其灵活性和强大的查询能力而备受推崇。然而,如何在服务器上安全使用 GraphQL 构建应用是一个值得深入讨论的话题。

为什么安全性很重要

虽然 GraphQL 本身很安全,但是它需要在服务器端进行有效的编写和配置,以保护您的应用不受恶意攻击。服务器应该验证和授权所有的查询和突变,以避免安全漏洞和数据泄露。

如何保护 GraphQL 服务

以下是几种保护 GraphQL 服务的建议。

限制访问

GraphQL 提供了很多查询和突变的功能,服务器应该缩小访问范围,只允许授权的用户或 API 使用者进行查询。您可以使用 token 或 cookie 对用户进行鉴权,或使用 IP 白名单、CORS、Firewall 等防火墙进行筛选。

例如,以下是 Node.js 中的 GraphQL 设置,以确保只有经过身份验证的用户才能对查询进行授权。

限制查询结果

GraphQL API 中提供了一个特别强大的功能,使应用能够灵活制定查询并仅获得所需数据。但是,如果不限制查询结果,就有可能产生负效应。例如,在查询中使用嵌套查询并抑制深度的限制(maximum depth)时,黑客可能会使用循环的方式查询其他数据来消耗系统资源。因此,在服务器端应该设置合适的查询限制(query limit)和深度限制来保护应用程序。

例如,在 Apollo Server 中,有一个名为 depthLimit 的函数可以限制查询的深度。

静态查询

GraphQL 在编写查询时有一个称为静态查询的过程。将 GraphQL 查询编写成静态查询可以让查询成为缓存的组件,从而减少了执行查询的时间。合理使用静态查询,不仅能提高性能,还有助于安全方面的问题。

例如,在应用程序中将查询从字符串形式更改为常量形式来创建静态查询。

防止拒绝服务攻击

GraphQL 服务本身非常容易遭到拒绝服务攻击。黑客可以使用深度查询或复杂查询,以消耗系统资源并使应用停止响应。因此,应该在服务器端设置适当的查询速度临界值,以便防止此类攻击。

例如,在 Apollo Server 中,如果查询时间超出设定的限制时间,则会自动终止执行查询的过程。

-- -------------------- ---- -------
----- ------ - ----------------------
  ---------
  ----------
  ----------------- -
    --------- --------------------------
  --
---

----- ------ - --- --------------
  -------
---

------------------------
  ----
  ----- -----------
---

结论

GraphQL 提供了强大和灵活的查询能力,但是在使用时要十分注意安全性。在服务器端进行有效的编写和配置,以保护应用不受恶意攻击,是保证 GraphQL 访问安全的关键所在。以上建议有助于防止几种常见的攻击,并帮助您确保 GraphQL 服务的安全。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fa547f44713626014b731d

纠错
反馈