Index
GraphQL API 中的别名重载
描述
GraphQL 中的别名重载发生在攻击者在查询中使用大量别名以压倒服务器的处理能力时。
GraphQL 中的别名允许客户端使用不同的名称多次请求相同的字段。然而,在单个查询中过度使用别名可能会通过耗尽服务器资源而导致拒绝服务(DoS)攻击。此攻击会降低性能或导致完全的服务中断。 示例:
query oxo {
alias1: __typename
alias2: __typename
alias3: __typename
alias4: __typename
alias5: __typename
...
}
别名重载的安全影响:
- 拒绝服务(DoS):通过发送包含大量别名的查询,攻击者可能导致服务器耗费过多资源进行处理和响应,从而可能减慢或使服务崩溃。
- 资源耗尽:服务器可能难以应对处理大量别名的计算负载,这可能导致内存耗尽、CPU 峰值或性能下降。
- 系统不可用:如果不加控制地进行别名重载攻击,它可能使 GraphQL API 不可用,从而中断所有用户的服务。
建议
为了减轻别名重载攻击的风险,您可以采取以下措施:
-
实现超时(timeouts):强制实施查询超时以终止解决时间过长的查询。通过设置最大执行时间,您可以自动终止滥用别名并消耗过多服务器资源的查询,从而防止拒绝服务(DoS)攻击。
-
限制别名:配置允许在单个 GraphQL 查询中的别名数量的服务器端限制。您可以配置如 GraphQL Armor 等工具来限制别名并防止过载。
// 配置 GraphQL Armor
GraphQLArmorConfig({
maxAliases: {
// 启用或禁用插件 | 默认:true
enabled: true,
// 设置每个查询允许的最大别名数 | 默认:50
n: 50,
// 接受查询时执行的回调
onAccept: [],
// 拒绝查询时执行的回调
onReject: [],
// 将拒绝详细信息传播给客户端 | 默认:true
propagateOnRejection: true,
}
})
import graphql
from graphql.language import ast
from graphql.language import parser
from settings import api
def validate_aliases(query: str) -> None:
"""
此验证防止执行包含过多别名的查询,以防止服务器过载。
"""
class AliasesParser(parser.Parser):
def parse_aliases(self) -> list[ast.FieldNode]:
aliases = 0
while self.peek(graphql.TokenKind.NAME):
aliases += 1
if aliases > api.API_MAX_ALIASES:
raise graphql.GraphQLError("Exception - Max aliases exceeded")
self.parse_field()
return []
ast_parser = AliasesParser(query)
ast_parser.parse_document()
链接
标准
- CWE_TOP_25:
- CWE_400
- PCI_STANDARDS:
- REQ_6_2
- REQ_6_4
- REQ_11_3
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- OWASP_ASVS_L3:
- V13_4_1
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CC_9_1
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213