Wykonuję poniższy kod wewnątrz serwletu i pobieranie tych błędów spotowych - błąd HRS_REQUEST_PARAMESTER_TO_HTTP_HEADER: Parametr HTTP bezpośrednio napisany do wyjścia nagłówka HTTP w SSOIDPLOGOOTREDIRECT.DOPOST (httpservletrequest, httpserderesponse)

String relayState = request.getParameter("RELAY_STATE");
if(relayState != null)
{
 response.sendRedirect(relayState);
}

Aby naprawić to błędy dodawałem poniżej kodu.

relayState = URLEncoder.encode(relayState,StandardCharsets.UTF_8);

Ale URL nie przekierowuje się w sposób prawidłowy, ponieważ widzę URL Relaystate został zmieniony po kodowaniu Oryginalny Relaystate = https://sad.ezhdj.net/system/web/apps/ dfgh /. i po zakodowaniu

Relaytate = HTTPS% 3A% 2F% 2FSAD.EZDEV.net% 2FSystem% 2FWEB% 2FAPPS% 2FDFGH% 2F

1
ashish gupta 22 listopad 2020, 12:17

1 odpowiedź

Najlepsza odpowiedź

Powinieneś użyć HttpServletResponse.encodeRedirectURL(), aby zakodować adresy URL przekierowania:

Ciąg Encoderedirecturl (URL string)

Koduje określony adres URL do użytku w metodzie sendRedirect lub, jeśli Kodowanie nie jest potrzebne, zwraca adres URL niezmieniony. Implementacja tej metody obejmuje logikę w celu ustalenia, czy identyfikator sesji musi być zakodowany w adresie URL.

...

Wszystkie adresy URL wysyłane do metody {X0}} powinny być Przeprowadzaj przez tę metodę ...

To powinno działać:

response.sendRedirect(response.encodeRedirectURL(relayState));

Ponieważ twój adres URL nie wymaga kodowania, wyjście z encodeRedirectURL() będzie:

https://sad.ezhdj.net/system/web/apps/dfgh/

A przekierowanie będzie działać dobrze.

edytuj:

Najwyraźniej proponowany rozwiązanie nadal wyzwala HRS_REQUEST_PARAMETER_TO_HTTP_HEADER} Błąd Spotbug.

Po tym więcej więcej Research Dowiedziałem się, że błąd ma zapobiegać Rozdzielenie odpowiedzi HTTP luka (tj. Gdy niepożądane \r\n są zapisywane w sekcji nagłówka odpowiedzi HTTP).

Powinniśmy wtedy lepiej Sanitize {{x0}

Wystarczy proste relayState.replace("\r\n", ""), aby sprawić, że błąd odejdzie:

response.sendRedirect(response.encodeRedirectURL(relayState.replace("\r\n", "")));
1
MarcoLucidi 23 listopad 2020, 10:54