Absinthe Graphql 嵌套查询安全性

Posted

技术标签:

【中文标题】Absinthe Graphql 嵌套查询安全性【英文标题】:Absinthe Graphql nested queries security 【发布时间】:2019-04-16 16:37:42 【问题描述】:

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

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/

【问题讨论】:

【参考方案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()

【讨论】:

【参考方案2】:

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

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

查看官方文档了解更多信息:https://hexdocs.pm/absinthe/complexity-analysis.html

【讨论】:

以上是关于Absinthe Graphql 嵌套查询安全性的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Absinthe GraphQL 订阅不起作用?

拨号器(通过 Dialyxir)从 Absinthe (GraphQL) 路由的 `forward` 命令发出有关“但此值不匹配”的警告。如何解决?

Elixir Absinthe GraphQL,联合 resolve_type list_of/1

数据库相关嵌套子查询

SQL Server 之 子查询与嵌套查询

SQL嵌套子查询和相关子查询的执行过程有啥区别