Безопасность вложенных запросов Absinthe Graphql - PullRequest
0 голосов
/ 13 ноября 2018

Я читал, что важно защитить ваши приложения с помощью максимальной глубины запроса.Это означает ограничить количество «уровней» запроса.Пример очень глубокого запроса:

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 Ответ

0 голосов
/ 22 ноября 2018

Вы можете написать промежуточное программное обеспечение, чтобы проверить 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()
...