防止 GraphQL API 的数据泄漏
GraphQL 是一种用于构建 API 的查询语言。它使开发人员能够通过声明性查询来获取所需数据,而不是像 RESTful API 那样必须使用多个端点进行调用。GraphQL API 支持批处理、类型检查、强类型查询和分页等功能。然而,这种强大的功能也存在着一些安全问题,尤其是在数据泄漏方面。
本文将探讨如何避免 GraphQL API 的数据泄漏问题。我们将从原理入手,描述每个漏洞的具体原理和示例代码,并提供一些指导意义。
GraphQL API 的数据泄漏漏洞
- 枚举漏洞
GraphQL API 可能会受到枚举漏洞的影响。攻击者可以通过枚举操作,获取有关 API 的敏感信息,例如可用类型或字段。攻击者通过对 GraphQL API 中功能模块、字段名称、参数名称等进行遍历,以尝试获得所有数据的名称和位置。
攻击者可以通过向 GraphQL API 发送多个请求来检查其响应中的错误信息,通过这些响应找到查询中的错误参数,最终获取API的有关结构性的所有信息。以下示例代码演示了这一点:
-- -------------------- ---- ------- -------- - -------- - ----- - ---- ---- ------ - ---- - - - -
在上面的代码中,攻击者可以找到 API 提供的所有数据类型名称和字段名称。它可以通过对具有计算能力的查询进行遍历,发现特定身份验证 URI 或识别符,这些身份验证 URI 或识别符可以使攻击者召回特定记录,包括敏感信息。
- 泄漏字段漏洞
GraphQL API 对于输入的值会根据先前定义的类型进行转换。由于缺乏对类型的限制,类型的枚举值可以被便捷地修改,导致攻击者传递意外的数据类型。剖析细粒度枚举值的能力可能使攻击者能够了解数据,使攻击者可以发现与断言源执行的查询正确,但是由于它们不包含针对共同恶意预期的数据,但是会导致泄漏有关数据的可能性。以下是示例代码:
-- -------------------- ---- ------- ---- ---- - --- --- ----- ------- ------ ------- ------ ------- - ---- ---- - --- --- ----- ------- - ---- ----- - --- ---- ------ ------- ------ ------- - ---- -------- - -------------- ---- ----- -------- ------ --------- ----- ------------------------ --------- ------- -
在上面的代码中,更新用户时,攻击者可以修改存储在数据中的“roles”字段,从而绕过正常的控件流程。例如,角色字段应该是只读的,但攻击者可以将一个用户的角色从“Guest”更改为“Admin”。为了防止这种情况,应该为角色字段添加相应的验证。
- 嵌入式查询漏洞
嵌入式查询漏洞是指一种攻击,其中嵌入在查询中的子查询可以使用攻击者传递的自定义参数生成。这使攻击者可以传递潜在有害的参数值,用于在批量查询中分离单个查询。以下示例代码演示了这一点:
-- -------------------- ---- ------- ----- ---- - -------- -- - ---- -------------- - ------ ------------ ---------- --- -- ------ --- - ----- --------------- --- -------- - ------ ------------ ---------- --- -- - ------- - - - -
在上面的示例代码中,通过传递不同的参数,攻击者可以访问所有用户的详细信息,包括用户名、发布的帖子和评论等。如果没有明确定义可用于过滤和排序的字段列表,则将不能保护嵌入式查询。
防范措施
- 具体化查询
缩小了 GraphQL 查询中返回的数据域。这可以防止枚举漏洞,因为敏感信息并不总是公开的,而是仅在特定查询中可见。例如,查询只请求与特定视图相关的数据,而不在公共GraphQL API上使用查询传递的所有数据。以下是一些例子:
query { me { name email } }
query { users { name } }
- 添加授权验证
授权验证是验证发起 GraphQL API 的连接的身份验证的过程,以确认发起请求的客户端是否具有访问 API 的权限。
例如,可以使用随机的加密令牌,以确保客户端是经过身份验证的用户。否则,GraphQL API 将不知道所请求的数据可用性,这可能允许某些开发人员窥视受保护的敏感数据。
- 字段验证
要确保字段中的数据始终被正确验证,特定字段应该仅通过特定的类型允许特定的输入。例如,字符型字段必须仅接受字符串值,而数字型字段必须仅允许数字和小数点值。
例如,字段“roles”可以进行以下更改:
-- -------------------- ---- ------- ---- ---- - --- --- ----- ------- ------ ------- ------ -------- - ---- ---- - --- --- ----- ------- -------- -------- - ---- ----- - --- ----- ------ -------- ------ -------- - ---- -------- - -------------- ---- ----- -------- ------ -------- ------ ------- ----- ------------------------ --------- -------- -
在上述代码示例中,检查了字段“roles”的输入,以确保输入中不存在非所需的属性“isAdmin”。
结论
这里提供的指南不仅可以满足当前的数据安全需求,而且还可以使 GraphQL API 可以在未来更新时更好地扩展。通过应用这些防范措施,用户可以确保 GraphQL API 数据在未经授权的情况下不会被泄漏。建议在开发 GraphQL API 项目时,优先考虑安全性,并开发相应的防范措施,以避免这种问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672f0c3aeedcc8a97c8c376d