Вопрос или проблема
В проекте Azure у меня есть сервисы, которые скрыты за сервисом управления API Azure. Идея заключается в том, чтобы перенаправить все запросы через APIm, чтобы все они могли быть проверены с помощью содержащихся в нем политик.
Например, у меня есть конечная точка на моем Service1:
POST api/users/{userId}
которая обновляет информацию о пользователе.
Мы не изменяли никаких настроек APIm, просто добавили дополнительные политики в секцию входящих запросов, и конечная точка работает как ожидалось.
Но мы выяснили, что когда мы добавляем завершающий слэш в конец конечной точки на APIm:
POST api/users/{userId}/
она возвращает ошибку 307 Временный перенаправление с “чистым” ссылкой azure на сервис.
Мы ожидаем, что это просто проигнорирует “https://stackoverflow.com/” в конце или вернет ошибку 404, но вместо этого мы раскрываем уязвимую информацию.
Google предлагает решение добавить политику, которая просто уберет “https://stackoverflow.com/” из конца url, но я не думаю, что это решение.
Мой следующий вопрос: есть ли способ сказать APIm возвращать 404 во всех неожиданных случаях и использовать ошибку 307 только когда я добавляю такую функциональность через политики?
Ответ или решение
Ошибка 307 Temporary Redirect с запросами Azure API Management и конечными слешами
В рамках работы с Azure API Management (APIm) существует ряд особенностей, которые могут вызывать неожиданные ошибки, такие как 307 Temporary Redirect, особенно когда дело касается обработка URL с конечными слешами. В данной статье мы рассмотрим причины этой проблемы и предложим способы её решения, чтобы избежать раскрытия уязвимой информации и настроить ваше API на возвращение корректных кодов состояния.
Причина проблемы
Когда вы обращаетесь к вашему API с добавлением конечного слеша, например:
POST api/users/{userId}/
Azure API Management интерпретирует это как необходимость перенаправления на другой URL, в данном случае без конечного слеша. Это поведение обусловлено тем, что конечный слеш и отсутствие слеша считаются разными ресурсами в рамках RESTful подхода.
Ошибка 307 Temporary Redirect может происходить по следующим причинам:
-
Конфигурация маршрутизации: APIm настроен на автоматическую обработку конечных слешей, что может вызывать нежелательное перенаправление. Это может стать уязвимостью вашего API, так как вы ненароком раскрываете внутренние URL-адреса.
-
Отсутствие явной обработки: В зависимости от вашего сервиса, если не предусмотрена явная обработка конечных слешей, Azure будет пытаться перенаправить запрос.
Предложенные решения
Чтобы обрабатывать запросы корректным образом и избежать 307 ошибок, можно рассмотреть следующие подходы:
-
Удаление конечного слеша с помощью политики:
Хотя и не всегда рекомендуется, можно написать политику для Azure APIm, которая будет удалять конечный слеш с URL. Это позволит сохранить ожидаемое поведение API, но не является идеальным решением, так как создаёт зависимость от политик.<inbound> <set-variable name="requestPath" value="@(context.Request.Path.TrimEnd('/'))" /> <rewrite-uri template="@(context.Variables["requestPath"])" /> </inbound>
-
Возврат 404 ошибки для некорректных URL:
Для достижения этого поведения вам необходимо настроить вашу APIm конфигурацию и политики, чтобы возвращать 404 ошибки в том случае, если запросы имеют неправильные конечные URL. Вы можете добавить следующую политику в секцию inbound:<inbound> <choose> <when condition="@(context.Request.Path.EndsWith("/"))"> <return-response> <set-status code="404" reason="Not Found" /> <set-header name="Content-Type" exists-action="override"> <value>application/json</value> </set-header> <set-body>@{ "error": "Invalid URL" }</set-body> </return-response> </when> </choose> </inbound>
Эта политика проверяет, заканчивается ли путь на слеш, и в случае да возвращает ошибку 404 с конкретным сообщением об ошибке.
-
Настройка маршрутизации через Azure Functions:
Ещё один подход заключается в использовании Azure Functions, где можно управлять обработкой конечных слешей более гибко. Вы можете написать функцию, которая будет проверять наличие конечного слеша и к которой можно будет добавлять с различной логикой обработки URL.
Заключение
Правильная конфигурация Azure API Management крайне важна для обеспечения безопасности и эффективности вашего API. Обработка неправильных URL-адресов, таких как конечные слеши, требует внимательного подхода. Используя предложенные методы, вы можете избегать уязвимостей, облегчая управление поведением вашего API и возвратом корректных ответов на запросы. В будущем, рекомендуется регулярно пересматривать принципы кастомизации и ограничения в APIm для успешного функционирования вашего сервиса.