2013-09-19 3 views
1

Я использую response.sendRedirect() для перенаправления пользователя на главную страницу после успешной аутентификации пользователя. Это делается для того, чтобы избежать «Локальной переадресации уязвимости».Как воссоздать проблему sendRedirect - изменение HTTPS на HTTP

Однако из-за вышеуказанного изменения один из моих клиентов сталкивается с проблемой, когда его запрос HTTPS преобразуется в HTTP (с IP-адресом в URL-адресе). Причина такой же объясняется здесь

http://geekexplains.blogspot.in/2008/06/https-becoming-http-in-case-of.html

Теперь, как я могу воспроизвести проблему (или настройки среды), так что я могу проверить мое исправление. Я думал, что могу воспроизвести, настроив сервер Apache infront для tomcat, но я не могу воспроизвести вышеупомянутую проблему.

В Apache httpd.conf я имею ниже записей

ProxyPass /myconsole ajp://localhost:8009/myconsole 
ProxyPassReverse /myconsole ajp://localhost:8009/myconsole 

Accessed приложение, как,

http://myapacheserver/myconsole/Login.jsp 

После успешного входа в систему, я получаю перенаправлены

http://myapacheserver/myconsole/Home.jsp 

I я ожидаю перенаправления на IP-адрес. что-то вроде http://10.32.24.14:8080/myconsole/Home.jsp.

В клиентской среде он перенаправляется на IP-адрес сервера приложений (tomcat).

Любой указатель будет полезен.

Благодаря

Примечание: Для тех, кто заинтересован, я строю полный URL, получив первую часть URI из конфигурационного файла.

//Get the LB URI part. Eg: https://dev.loadbalancer.com/ 
String loadBalancerURI = getConfig().getLoadBalancerRequestURI(); 
String redirectURL = request.getContextPath() + "/Home.jsp"; 

//Prepend the LoadBalancer URI with redirect URI 
if(loadBalancerURI != null) 
{ 
    redirectURL = loadBalancerURI + "/" + redirectURL; 
} 

//redirect to home page 
response.sendRedirect(redirectURL); 

return; 

Edit: Более подробную информацию о настройке. У клиента есть балансировщик нагрузки F5, где SSL-трафик останавливается, а затем есть Apache Reverse Proxy-серверы, который прокси-сервер для пула серверов tomcat. Проблема в том, что мы перенаправляем URL-адрес перенаправления для Tomcat Servers. Мы ожидаем, что URL-адрес балансировки нагрузки будет перенаправлен на URL-адрес перенаправления.

Возможно ли сделать некоторые изменения на сервере Apache, который будет переписывать URL-адрес в HTTP-заголовке в ответе от Tomcat?

ответ

0

Я был в состоянии воспроизвести проблему (когда HTTP-HTTPS перенаправление), которые мой клиент сталкивается.

Связь с сервером Apache (HTTPD-сервер) в Tomcat (веб-контейнер) обычно происходит с использованием одного из следующих разъемов (может быть, и в другом виде).

  • mod_jk
  • mod_proxy_ajp
  • mod_proxy_http
  • mod_rewrite

Я могу воспроизвести проблему только тогда, когда я использую mod_rewrite. Если я использую mod_jk или mod_proxy_ajp или mod_proxy_http, то перенаправление работает нормально. Но когда я использую mod_rewrite, тогда, когда происходит перенаправление, я могу наблюдать HTTPS-HTTP-преобразование.

0

Я не уверен, что если вы действительно используете балансировки нагрузки или если вы просто назвать одним из ваших методов getLoadBalancerRequestURI, но там, где у вас есть только один сервер, просто используйте:

response.sendRedirect("./Home.jsp"); 

Его не нужно для указания полного URL-адреса.

Но если вам нужно построить полный URL, как вы делаете, вы можете использовать что-то вроде этого, чтобы проверить, если его https: //

String protocol = "https"; 
if(request.getRequestURL().toString().toLowerCase().startsWith("http://")) 
{ 
    protocol = "http"; 
} 

Затем убедитесь, что строить URL с надлежащей протокол.

+0

getLoadBalancerRequestURI() - мой собственный метод, который возвращает значение из файла конфигурации. Да, я мог бы создать URL-адрес потока на основе запросаURL, но не будет ли URL-адрес запроса http? поскольку запрос, полученный Tomcat, находится в протоколе HTTP? Я ищу, как воспроизвести проблему, с которой столкнулся клиент, где они использовали SSLOffloader для преобразования протокола HTTPS в HTTP. – param83

+0

Я не знаю о вашем обратном прокси, но с jkconnector запрос, который получает сервер Tomcat, является исходным запросом пользователя в отношении request.getRequestURL(). Я получаю доменное имя моего DMZ-сервера, а не IP-адрес моего сервера tomcat. И я использовал его, чтобы определить, пришел ли пользователь через https или нет. – developerwjk

+0

Итак, getRequestURL() даст мне имя машины балансировки нагрузки (на самом деле получен оригинальный запрос). Однако почему почему sendRedirect() помещает ip-адрес в URL-адрес перенаправления? Кроме того, я изо всех сил пытаюсь настроить среду, в которой я вижу эту проблему. Клиент использует продукт BIG-IP (F5). Конечно, я не могу использовать его в своей тестовой среде. Есть ли лучший способ имитировать настройку развертывания клиента? – param83

0

См. Ссылку ..

Итак, когда происходит перенаправление запроса https, целевой сервер не знает, что такое протокол исходного запроса. Он получает только HTTP-запрос. Таким образом, ответ для этого будет ответом на HTTP.

http://www.hoitikwong.com/2013/03/the-mystery-case-of-https-becoming-http.html

Смежные вопросы