防止 GraphQL API 的数据泄漏

阅读时长 5 分钟读完

防止 GraphQL API 的数据泄漏

GraphQL 是一种用于构建 API 的查询语言。它使开发人员能够通过声明性查询来获取所需数据,而不是像 RESTful API 那样必须使用多个端点进行调用。GraphQL API 支持批处理、类型检查、强类型查询和分页等功能。然而,这种强大的功能也存在着一些安全问题,尤其是在数据泄漏方面。

本文将探讨如何避免 GraphQL API 的数据泄漏问题。我们将从原理入手,描述每个漏洞的具体原理和示例代码,并提供一些指导意义。

GraphQL API 的数据泄漏漏洞

  1. 枚举漏洞

GraphQL API 可能会受到枚举漏洞的影响。攻击者可以通过枚举操作,获取有关 API 的敏感信息,例如可用类型或字段。攻击者通过对 GraphQL API 中功能模块、字段名称、参数名称等进行遍历,以尝试获得所有数据的名称和位置。

攻击者可以通过向 GraphQL API 发送多个请求来检查其响应中的错误信息,通过这些响应找到查询中的错误参数,最终获取API的有关结构性的所有信息。以下示例代码演示了这一点:

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

在上面的代码中,攻击者可以找到 API 提供的所有数据类型名称和字段名称。它可以通过对具有计算能力的查询进行遍历,发现特定身份验证 URI 或识别符,这些身份验证 URI 或识别符可以使攻击者召回特定记录,包括敏感信息。

  1. 泄漏字段漏洞

GraphQL API 对于输入的值会根据先前定义的类型进行转换。由于缺乏对类型的限制,类型的枚举值可以被便捷地修改,导致攻击者传递意外的数据类型。剖析细粒度枚举值的能力可能使攻击者能够了解数据,使攻击者可以发现与断言源执行的查询正确,但是由于它们不包含针对共同恶意预期的数据,但是会导致泄漏有关数据的可能性。以下是示例代码:

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

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

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

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

在上面的代码中,更新用户时,攻击者可以修改存储在数据中的“roles”字段,从而绕过正常的控件流程。例如,角色字段应该是只读的,但攻击者可以将一个用户的角色从“Guest”更改为“Admin”。为了防止这种情况,应该为角色字段添加相应的验证。

  1. 嵌入式查询漏洞

嵌入式查询漏洞是指一种攻击,其中嵌入在查询中的子查询可以使用攻击者传递的自定义参数生成。这使攻击者可以传递潜在有害的参数值,用于在批量查询中分离单个查询。以下示例代码演示了这一点:

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

在上面的示例代码中,通过传递不同的参数,攻击者可以访问所有用户的详细信息,包括用户名、发布的帖子和评论等。如果没有明确定义可用于过滤和排序的字段列表,则将不能保护嵌入式查询。

防范措施

  1. 具体化查询

缩小了 GraphQL 查询中返回的数据域。这可以防止枚举漏洞,因为敏感信息并不总是公开的,而是仅在特定查询中可见。例如,查询只请求与特定视图相关的数据,而不在公共GraphQL API上使用查询传递的所有数据。以下是一些例子:

  1. 添加授权验证

授权验证是验证发起 GraphQL API 的连接的身份验证的过程,以确认发起请求的客户端是否具有访问 API 的权限。

例如,可以使用随机的加密令牌,以确保客户端是经过身份验证的用户。否则,GraphQL API 将不知道所请求的数据可用性,这可能允许某些开发人员窥视受保护的敏感数据。

  1. 字段验证

要确保字段中的数据始终被正确验证,特定字段应该仅通过特定的类型允许特定的输入。例如,字符型字段必须仅接受字符串值,而数字型字段必须仅允许数字和小数点值。

例如,字段“roles”可以进行以下更改:

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

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

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

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

在上述代码示例中,检查了字段“roles”的输入,以确保输入中不存在非所需的属性“isAdmin”。

结论

这里提供的指南不仅可以满足当前的数据安全需求,而且还可以使 GraphQL API 可以在未来更新时更好地扩展。通过应用这些防范措施,用户可以确保 GraphQL API 数据在未经授权的情况下不会被泄漏。建议在开发 GraphQL API 项目时,优先考虑安全性,并开发相应的防范措施,以避免这种问题。

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

纠错
反馈