我一直在阅读,以最大查询深度保护您的应用程序很重要。含义是,限制查询具有的“级别”数。非常深入的查询示例:
query IAmEvil {
author(id: "abc") {
posts {
author {
posts {
author {
posts {
author {
# that could go on as deep as the client wants!
}
}
}
}
}
}
}
}
我如何知道查询的深度级别?最终不允许执行深度超过4的查询。 我可以获取完整的查询来手动计算深度吗?还是他们已经实现了?
答案 0 :(得分:1)
您可以编写中间件来检查selection_depth并将其阻止。像这样:
@impl Absinthe.Middleware
def call(res, _config) do
IO.inspect(selection_depth(res.definition.selections))
res
end
def selection_depth([], depth), do: depth + 1
def selection_depth(selections, depth \\ 0),
do: selections |> Enum.map(&selection_depth(&1.selections, depth + 1)) |> Enum.max()
答案 1 :(得分:0)
处理此问题的一种方法可能是使用苦艾酒的复杂性分析功能。您可以为每个字段声明静态复杂度或将用于计算动态复杂度的函数,并设置最大复杂度。
如果查询达到最大复杂度,将返回错误。
有关更多信息,请参见官方文档:https://hexdocs.pm/absinthe/complexity-analysis.html