Является ли 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 заголовок запроса.

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