绝不再犯的错误:避免在 GraphQL API 中公开敏感数据

阅读时长 3 分钟读完

GraphQL 作为一项现代化的 API 技术,大大简化了前端与后端之间的数据交互过程。然而,如何在 GraphQL API 中保护敏感数据却是一个被许多程序员容易忽略的问题。在本文中,我们将探讨该问题的原因以及解决方案,并展示一些示例代码,帮助你更好地理解如何避免在 GraphQL API 中公开敏感数据。

问题

GraphQL API 通过类型系统定义了一系列的查询和操作,使得前端可以精确地请求所需的数据,并且在数据模型上极其灵活。然而,如果不恰当地设计 GraphQL API,就可能会导致出现安全性问题。其中最常见的问题就是在 API 返回结果中公开了敏感数据。

原因

通常,公开敏感数据的问题出现在 GraphQL 模型的设计上。在 GraphQL 中,将数据模型定义为类型和字段的集合,类型是数据模型的基本单位,而字段描述了每种类型的数据模型。如果不注意模型的定义,就可能会把敏感数据定义为某个类型的字段并在查询时返回它。

例如:

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

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

在这个示例中,我们定义了一个名为 User 的类型,它包含了 id、name、email 和 password 字段,其中 password 是敏感数据。但是,当我们定义用于查询用户的 user 查询时,我们并没有删除 password 字段。实际上,当前端发送类似于下面的查询时,API 将返回敏感数据:

如果黑客利用这个漏洞,并使用返回的密码进行攻击,后果将是灾难性的。

解决方案

为了解决 GraphQL API 中公开敏感数据的问题,我们需要从数据模型设计的角度入手。在设计数据模型时,我们应该仔细思考哪些字段是敏感数据,并把它们从类型的定义中删除。

例如,我们可以修改以上示例中的 User 类型,从而避免返回密码字段:

这样,当我们进行用户查询时,将不再返回密码字段。如果前端需要验证密码,应该使用专门的身份验证 API 进行验证,而非在 GraphQL API 中暴露密码字段。

示例代码

以下是一个示例 GraphQL 模型定义,它避免了在 API 中公开敏感数据:

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

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

当前端发送查询时,密码字段不再出现在响应中。

结论

在 GraphQL API 中保护敏感数据是开发人员必须要学会的内容。通过仔细设计数据模型,我们可以轻松地解决相关问题,并保护用户的数据安全。建议在设计 GraphQL API 时,仔细评估每个字段是否包含敏感信息,并在必要时,考虑实现专门的 API 来处理验证等任务。

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

纠错
反馈