Рубрики
Без рубрики

Использование символа косой черты в URL-адресах Spring

Изучите несколько способов работы с URL-адресами, содержащими символы косой черты весной.

Автор оригинала: Marcos Lopez Gonzalez.

1. введение

При разработке веб-сервисов нам может потребоваться иметь дело со сложными или неожиданными URL-путями, которые могут содержать косые черты . Как следствие, мы можем столкнуться с проблемами с веб-серверами или фреймворками, которые мы используем.

Весна, в частности, может быть немного сложной в этом отношении из-за конфигураций по умолчанию, которые она предоставляет.

В этом уроке мы покажем некоторые общие решения и рекомендации по обработке URL-адресов с косыми чертами весной . Мы также увидим, почему мы не должны использовать некоторые общие хаки для решения этих проблем. Продолжайте читать, чтобы узнать об этом больше!

2. Проанализируйте запрос вручную

В наших веб-службах иногда нам нужно сопоставить все запросы по определенному пути к одной и той же конечной точке. Что еще хуже, мы можем не знать, как будет выглядеть остальная часть пути. Возможно, нам также потребуется каким-то образом получить этот путь в качестве параметра, чтобы использовать его позже.

Допустим, мы можем получать запросы с любым путем в разделе /мои пути :

http://localhost:8080/mypaths/any/custom/path

И предположим, что мы хотим сохранить все эти разные пути в базе данных, чтобы знать, какие запросы мы получаем.

Первое решение, которое, вероятно, придет нам в голову, – это записать динамическую часть пути в переменную Path :

@GetMapping("mypaths/{anything}")
public String pathVariable(@PathVariable("anything") String anything) {
    return anything;
}

К сожалению, вскоре мы узнаем, что это возвращает 404 если переменная Path содержит косую черту . Символ косой черты является стандартным разделителем URI path, и все, что идет после него, считается новым уровнем в иерархии путей. Как и ожидалось, Весна следует этому стандарту.

Мы можем легко решить эту проблему, создав резерв для всех запросов по определенному пути, используя ** подстановочный знак :

@GetMapping("all/**")
public String allDirectories(HttpServletRequest request) {
    return request.getRequestURI()
        .split(request.getContextPath() + "/all/")[1];
}

Затем мы должны сами проанализировать URI, чтобы получить интересующую нас часть пути.

Это решение очень удобно при работе с URL-подобными параметрами , но, как мы увидим в следующем разделе, этого недостаточно для некоторых других случаев.

3. Используйте Параметры запроса

В отличие от нашего предыдущего примера, есть и другие случаи, когда мы не просто сопоставляем разные пути, но получаем любую строку | в качестве параметра в URL-адресе.

Давайте представим, что в нашем предыдущем примере мы делаем запрос с параметром path, который содержит последовательные косые черты :

http://localhost:8080/all/http://myurl.com

Сначала мы думали, что это должно сработать, но вскоре поняли, что ваш контроллер возвращается http:/myurl.com. Это происходит потому, что Spring Security нормализует URL-адреса и заменяет любую двойную косую черту одной .

Spring также нормализует другие последовательности в URL-адресах, такие как обход пути. Он принимает эти меры предосторожности для предотвращения обхода вредоносными URL-адресами определенных ограничений безопасности , как описано в официальной документации по безопасности Spring .

В этих случаях настоятельно рекомендуется вместо этого использовать параметры запроса:

@GetMapping("all")
public String queryParameter(@RequestParam("param") String param) {
    return param;
}

Таким образом, мы можем получить любой параметр String без этих ограничений безопасности, и наш веб-сервис будет более надежным и безопасным.

4. Избегайте Обходных Путей

Представленные нами решения могут повлечь за собой некоторые изменения в дизайне наших сопоставлений. Это может побудить нас использовать некоторые общие обходные пути, чтобы заставить наши исходные конечные точки работать при получении косых черт в URL-адресах.

Наиболее распространенным обходным путем, вероятно, является кодирование косых черт в параметрах пути. Тем не менее, некоторые уязвимости безопасности были зарегистрированы в прошлом, и большинство веб-серверов и серверов приложений отреагировали на это, запретив по умолчанию кодированные косые черты . По-прежнему можно изменить это поведение, просто изменив соответствующую настройку, как в Tomcat .

Другие, такие как Apache Server , пошли немного дальше и ввели опцию, позволяющую кодировать косые черты без их декодирования, чтобы они не интерпретировались как разделители путей. В любом случае, это не рекомендуется, и это может привести к потенциальным угрозам безопасности.

С другой стороны, веб-фреймворки также принимают некоторые меры предосторожности. Как мы уже видели ранее, Spring добавляет некоторые механизмы для защиты от менее строгих контейнеров сервлетов . Таким образом, в случае, если мы разрешим закодированные косые черты на нашем сервере, мы все равно должны разрешить их весной.

Наконец, существуют и другие виды обходных путей, такие как изменение нормализации URI, которую Spring предоставляет по умолчанию. Как и прежде, мы должны быть очень осторожны, если изменим эти значения по умолчанию.

5. Заключение

В этой короткой статье мы показали некоторые решения для борьбы с косыми чертами в URL-адресах весной. Мы также ввели некоторые проблемы безопасности, которые могут возникнуть, если мы изменим конфигурации серверов или фреймворков по умолчанию, такие как Spring.

Как правило, параметры запроса обычно являются лучшим решением для работы с косыми чертами в URL-адресах.

Как всегда, полный исходный код примеров доступен на GitHub .