1

我一直在阅读,使用最大查询深度来保护您的应用程序很重要。意思是,限制查询的“级别”数量。一个非常深的查询示例:

query IAmEvil {
  author(id: "abc") {
    posts {
      author {
        posts {
          author {
            posts {
              author {
                # that could go on as deep as the client wants!
              }
            }
          }
        }
      }
    }
  }
}

如何知道查询的深度级别?并最终不允许执行深度超过 4 的查询。我可以获得完整的查询以手动计算深度吗?还是他们已经实施了?

这个问题也在这里描述:https ://www.howtographql.com/advanced/4-security/

4

2 回答 2

3

您可以编写一个中间件来检查 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()
于 2018-11-22T20:25:20.617 回答
1

处理此问题的一种方法是使用苦艾酒的复杂性分析功能。您可以为每个字段声明静态复杂度或用于计算动态复杂度的函数,并设置最大复杂度。

如果查询达到最大复杂度,将返回错误。

有关更多信息,请参阅官方文档:https ://hexdocs.pm/absinthe/complexity-analysis.html

于 2019-10-07T10:36:14.443 回答