我想了解是否存在一种机制来限制GraphQL查询中的子查询数量,以减轻GraphQL批处理攻击。(由于GraphQL的批处理特性,每个HTTP请求可以发送多个突变请求)
。
{
first: changeTheNumber(newNumber: 1) {
theNumber
}
second: changeTheNumber(newNumber: 1) {
theNumber
}
third: changeTheNumber(newNumber: 1) {
theNumber
}
}
我用的是graphql-java-kickstart
在graphql-java
中有两种仪器可以检查"深度";或";complexity"或者您的查询:
- MaxQueryDepthInstrumentation
- MaxQueryComplexityInstrumentation
第一个检查查询的深度(请求有多少层),第二个计算字段。您可以配置预期的最大深度/复杂度,如果查询比您配置的数字更深/更复杂,它将被拒绝。您可以自定义MaxQueryComplexityInstrumentation
的行为,以便某些字段计数为"更复杂"。(例如,你可以说一个普通的字符串字段比一个在处理时需要自己的数据库请求的字段更简单)。
下面是一个在模式描述中使用自定义指令(Complexity
)来确定字段复杂度的示例。
如果你只是想避免一个特定的字段被请求不止一次,你可以自己编写Instrumentation
或在你的解析器函数中使用DataFetchingEnvironment
来计算当前查询中该字段的数量(getSelectionSet()
允许访问当前查询中包含的所有字段)。