GraphQL 安全性实践指南

阅读时长 6 分钟读完

GraphQL 是一种流行的 API 技术,它提供了一种强大而灵活的方式来查询和操作数据。但是,如果没有得到正确地配置和监管,GraphQL 也可能会带来安全问题。

为了确保 GraphQL API 的安全性,本指南将重点介绍以下几个方面:

  1. 认证和授权
  2. 数据验证和限制
  3. 安全配置和监管

1. 认证和授权

认证和授权是 GraphQL API 安全性的基本要素。可用的认证和授权选项包括:

  • HTTP 基本身份验证:使用 Base64 编码的用户名和密码进行认证。虽然易于实现,但是不太安全,因为凭据在每次请求中都明文传输。
  • OAuth2:使用令牌进行认证和授权。OAuth2 是一种较为安全的选项,因为它可以通过分离访问令牌和认证凭据来减少需要公开传输的信息量。
  • 用户名/密码:使用用户名和密码进行认证。虽然这是一种常见的方式,但是要注意避免凭据的明文传输。

除了上述选择外,您还可以使用其他认证和授权方案,例如 SAML 或 OpenID Connect。

GraphQL API 还可以通过将权限从某些字段或查询中删除来加强授权。GraphQL 的灵活性允许您为每个字段、查询和突变分配不同的权限。

以下是一个基于 GraphQL 和 Node.js 的示例代码,展示了如何实现授权逻辑:

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

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

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

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

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

由上面的示例代码可知,当没有用户凭据(例如,没有提供授权头)时,会抛出错误。受该保护的查询将被阻止。

2. 数据验证和限制

GraphQL API 的第二个安全性挑战是确保输入数据的有效性和正确性。这可以通过以下方法实现:

  • 精细的类型定义:使用类型系统确保数据类型的一致性并规范输入的格式。
  • 数据验证:使用数据验证程序(例如,Joi 或 ajv)来确保输入的数据符合预期的模式和规则。
  • 限制查询:对于极端查询,例如递归查询或在同一查询中使用多个重复字段,可以通过限制查询深度和复杂度来防止恶意查询。

以下是一个基于 GraphQL 和 JavaScript 的示例代码,展示了如何使用 Joi 来验证输入数据:

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

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

Joi 是一种常见的 JavaScript 数据验证工具。在上面的示例代码中,使用 schema 对输入数据进行验证,检查 email 是否是有效的电子邮件地址,密码是否符合要求等。如果验证失败,会抛出 UserInputError 错误。

3. 安全配置和监管

除了认证、授权和数据验证之外,配置和监管 GraphQL API 也非常重要。这包括以下方面:

  • 处理敏感查询:敏感查询可能导致数据泄露或恶意操作。因此,必须限制用户可以使用的查询。例如,限制某些账户只能进行公共查询。
  • 日志记录与审计:记录访问日志并监控 API 的使用情况是及时发现安全问题的关键。
  • 使用 HTTPS 协议:使用 HTTPS 协议提供的安全通信。

以下是一个基于 GraphQL 和 Node.js 的示例代码,展示了如何限制查询并记录访问日志:

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

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

在上述示例代码中,限制输入 query 不能包含 "SnakeQuery" 或 "SecretDataQuery"。另外,使用 loggingMiddleware 记录 GraphQL API 的每个请求。

总结

GraphQL API 提供灵活的数据查询和操作方式,当得到正确的配置和监管时,GraphQL API 可以是安全的。我们提供了基于认证、授权、数据验证、配置和监管的实践指南,希望能在实际开发中为您提供参考。

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

纠错
反馈