苦艾酒Graphql嵌套查询安全性

时间:2018-11-13 19:05:06

标签: graphql absinthe

我一直在阅读,以最大查询深度保护您的应用程序很重要。含义是,限制查询具有的“级别”数。非常深入的查询示例:

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/

2 个答案:

答案 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