Запросы Azure API Management с завершающими слэшами возвращают ошибку 307 Temporary Redirect.

Вопрос или проблема

В проекте 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 может происходить по следующим причинам:

  1. Конфигурация маршрутизации: APIm настроен на автоматическую обработку конечных слешей, что может вызывать нежелательное перенаправление. Это может стать уязвимостью вашего API, так как вы ненароком раскрываете внутренние URL-адреса.

  2. Отсутствие явной обработки: В зависимости от вашего сервиса, если не предусмотрена явная обработка конечных слешей, Azure будет пытаться перенаправить запрос.

Предложенные решения

Чтобы обрабатывать запросы корректным образом и избежать 307 ошибок, можно рассмотреть следующие подходы:

  1. Удаление конечного слеша с помощью политики:
    Хотя и не всегда рекомендуется, можно написать политику для Azure APIm, которая будет удалять конечный слеш с URL. Это позволит сохранить ожидаемое поведение API, но не является идеальным решением, так как создаёт зависимость от политик.

    <inbound>
       <set-variable name="requestPath" value="@(context.Request.Path.TrimEnd('/'))" />
       <rewrite-uri template="@(context.Variables["requestPath"])" />
    </inbound>
  2. Возврат 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 с конкретным сообщением об ошибке.

  3. Настройка маршрутизации через Azure Functions:
    Ещё один подход заключается в использовании Azure Functions, где можно управлять обработкой конечных слешей более гибко. Вы можете написать функцию, которая будет проверять наличие конечного слеша и к которой можно будет добавлять с различной логикой обработки URL.

Заключение

Правильная конфигурация Azure API Management крайне важна для обеспечения безопасности и эффективности вашего API. Обработка неправильных URL-адресов, таких как конечные слеши, требует внимательного подхода. Используя предложенные методы, вы можете избегать уязвимостей, облегчая управление поведением вашего API и возвратом корректных ответов на запросы. В будущем, рекомендуется регулярно пересматривать принципы кастомизации и ограничения в APIm для успешного функционирования вашего сервиса.

Оцените материал
Добавить комментарий

Капча загружается...