速率限制是一种限制向 API 发送请求的方法。但 GraphQL API 还有另一种限制请求的方法,称为深度限制(depth limiting),它根据请求的深度来限制查询。

如果应用程序接口在一定时间内收到过多的请求,它们的运行速度就会减慢甚至崩溃。请求限制功能允许API提供商通过控制请求数量来保证其应用程序接口为所有用户运行。

同样,如果查询过于复杂,GraphQL API 也会变慢或崩溃,我们可以使用深度限制来解决这个问题。接下来,让我们先快速了解一下 GraphQL API。

GraphQL APIs

GraphQL 是一种查询语言,是数据查询和操作的 API 标准。GraphQL 查询可实现声明式数据获取,并只暴露一个端点,您可以用它来获取数据。

要了解 GraphQL 如何工作,可以将其视为一个图形。当被请求时,它会暴露图中的一条 “边”,也就是一个端点。

Depth Limiting

深度限制(Depth Limiting)根据深度限制 GraphQL 操作,以避免大型嵌套查询。正如我们前面所讨论的,GraphQL 允许你通过字段嵌套来指定所需的精确数据。虽然这是一个优点,但也可能是一个缺点。请看下面的查询:

{
user(id: '12') { # depth 0
posts { # depth 1
title
}
}
}

它获取用户所有帖子的标题。使用嵌套通过user和posts字段来获取它们的标题。

GraphQL 的设计允许查询无限增长。假设我们有User一个包含帖子列表的类型。

{
user(id: "12") {
posts {
title
}
}
}

该Posts类型还允许像这样获取用户:

{
posts(id: "12") {
user {
name
}
}
}

攻击者可以利用这种嵌套创建类似的复杂循环查询,如下所示:

query badQuery { # depth 0
user(id: "12") { # depth 1
posts { # depth 2
user { # depth 3
name
posts { # depth 4
user { # depth 5
posts { # depth 6
title
user { # depth 7
# and more..
}
}
}
}
}
}
}
}

正如您所看到的,这个查询有好几层,会形成一个大循环。像这样的查询计算成本很高,可能会导致 API 无法响应。因此,我们可以应用深度限制来保护 API 免受影响。

您可以设置一个特定的数字(如 7)来限制 API 的嵌套深度。这样,如果查询的嵌套层级超过 7 级,就会被拒绝。想象一下,如果一个恶意查询有 100 多层嵌套,却没有深度限制。这将是毁灭性的,对吗?这就是应用深度限制的原因。

原文链接:What is Depth Limiting in APIs?

Leave a Reply