Является ли HttpServletRequest.getRequestURL() поддельным?
Надеюсь, вопрос понятен. Я устанавливаю среду Spring Security с CAS-сервером. Поскольку одно и то же приложение развернуто на том же сервере, но сервер доступен через разные имена хостов (домен.de, домен.com, возможно, более того), и мы хотим развернуть одно и то же приложение в тестовых и локальных системах. Кроме того, я создал динамический сервис, где URL-адрес сервиса получен из URL-адреса запроса.
public static String makeDynamicUrlFromRequest(ServiceProperties serviceProperties, HttpServletRequest request) {
String serviceUrl = "https://backup-url.de/login";
URI uri = null;
try {
uri = new URI(request.getRequestURL().toString());
} catch (URISyntaxException e) {
logger.error("Someone tried accessing a disallowed service!", e);
}
if(uri != null){
serviceUrl = uri.getScheme() + "://" + uri.getHost() + "/login";
}
return serviceUrl;
}
Можно ли подделать это? Если да, то обеспечивает ли дополнительная проверка регулярных выражений необходимую защиту от этого?
1 ответ
@developerwjk
"Если бы они изменили URL-адрес запроса, как бы вы получили запрос?"
HTTP-сервер - это просто программа, которая прослушивает порт TCP, ожидает некоторого входящего текста и записывает некоторый текст в качестве ответа. (Тривиальный веб-сервер можно написать примерно за 20 строк кода.) Он видит только IP-адрес и порт того, что к нему подключено. Это может быть даже прокси или какое-то другое промежуточное ПО. Если вы не сообщите программе, кстати, я связывался с вами по URL-адресу
http://my.com/myapp/servlet
"тогда он просто не знает, например, как браузер до него доберется.
@Schaka Я не знаю о вашей конкретной настройке, но для jetty9 результат определяется из URL-адреса запроса в заголовке запроса и - если первое отсутствует - URL-адреса в параметре. То есть, если вы подключитесь к
my.com
и отправьте следующий запрос:
POST http://spoofed1.tld/myapp/servlet HTTP/1.1
Host: spoofed2.tld
(Имейте в виду, что параметр является обязательным.)
Тогда
getRequestURL
вернусь
http://spoofed1.tld/myapp/servlet
И если вы отправите это:
POST /myapp/servlet HTTP/1.1
Host: spoofed2.tld
Тогда сама пристань ответит
HTTP/1.1 302 Found
Location: http://spoofed2.tld/myapp/servlet
Content-Length: 0
Server: Jetty(<some version number>)
Итак, ответ - да, HttpServletRequest.getRequestURL () является подделкой! изменив URL-адрес запроса и / или
Host
заголовок запроса.