由于 GraphQL 允许客户端自选响应格式与关系嵌套,攻击者可以构造无限循环引用递归查询(例如 author -> books -> author -> books...),引发数据库 N+1 级联查询导致 CPU 耗尽。
一、限制 AST 查询最大深度
typescript
import { createComplexityLimitRule } from 'graphql-validation-complexity';
import depthLimit from 'graphql-depth-limit';
const server = new ApolloServer({
typeDefs,
resolvers,
validationRules: [
depthLimit(5), // 限制最大深度不超过 5 层
createComplexityLimitRule(1000) // 限制加权查询复杂度上限
],
});