Безопасность вложенных запросов Absinthe Graphql
Я читал, что важно защитить ваши приложения с максимальной глубиной запроса. Это означает ограничить количество "уровней", которые имеет запрос. Пример очень глубокого запроса:
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()
Один из способов справиться с этим - использовать функцию анализа сложности Absinthe. Вы можете объявить статическую сложность или функцию, которая будет использоваться для вычисления динамической сложности для каждого поля, и установить максимальную сложность.
Если запрос достигнет максимальной сложности, будет возвращена ошибка.
См. Официальную документацию для получения дополнительной информации: https://hexdocs.pm/absinthe/complexity-analysis.html