Безопасность вложенных запросов 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

Другие вопросы по тегам