嵌套查询成本分析:预防深度递归与 N+1 攻击
通过计算每个字段的权重(数据库查询次数、复杂度),动态拒绝或降级高成本查询。 · 难度:入门 · +10XP
嵌套查询成本分析
GraphQL 的灵活性允许恶意客户端构造深度嵌套查询导致数据库崩溃。本教程将实现一个成本分析中间件,计算每个字段的'权重'(例如,列表字段权重高,关联字段累加),并在执行前根据总成本阈值拒绝请求。我们将基于 graphql-query-complexity 库,并扩展它支持异步成本计算(例如根据数据量动态调整)。还会演示如何将成本信息通过 extensions 返回给客户端,用于优化查询。
const { getComplexity, simpleEstimator } = require('graphql-query-complexity');
const complexity = getComplexity({
schema,
query: document,
variables: {},
estimators: [
simpleEstimator({ defaultComplexity: 1 }),
// 自定义字段成本
(args) => args.field.name === 'users' ? 10 : 1
]
});
if (complexity > 100) {
throw new Error('Query too complex');
}