修复现场错误 - HRS_REQUEST_PARAMETER_TO_HTTP_HEADER

fix for spot bug - HRS_REQUEST_PARAMETER_TO_HTTP_HEADER

我在 servlet 中执行以下代码并发现了这个错误 - HRS_REQUEST_PARAMETER_TO_HTTP_HEADER Bug: HTTP 参数直接写入 HTTP header output in SSOIdpLogoutRedirect.doPost(HttpServletRequest, HttpServletResponse)

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

为了修复这个错误,我添加了下面的代码。

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

但是 URL 没有以正确的方式重定向,因为我可以看到中继状态 url 在编码后已更改 原始中继状态 = https://sad.ezhdj.net/system/web/apps/dfgh/ 编码后是

relaystate =https%3A%2F%2Fsad.ezdev.net%2Fsystem%2Fweb%2Fapps%2Fdfgh%2F`

你应该使用 HttpServletResponse.encodeRedirectURL() 编码重定向 urls:

String encodeRedirectURL(String url)

Encodes the specified URL for use in the sendRedirect method or, if encoding is not needed, returns the URL unchanged. The implementation of this method includes the logic to determine whether the session ID needs to be encoded in the URL.

...

All URLs sent to the HttpServletResponse.sendRedirect method should be run through this method...

这应该有效:

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

由于您的 url 实际上不需要编码,因此 encodeRedirectURL() 的输出将是:

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

重定向将正常工作。

编辑:

显然提出的解决方案仍然会触发 HRS_REQUEST_PARAMETER_TO_HTTP_HEADER spotbug 错误。

在做更多 research I found out that the error is meant to prevent HTTP response splitting 漏洞之后(即当不需要的 \r\n 被写入 http 响应的 header 部分时)。

然后我们应该更好地清理relayState以防止此类漏洞。

一个简单的 relayState.replace("\r\n", "") 就足以让错误消失:

response.sendRedirect(response.encodeRedirectURL(relayState.replace("\r\n", "")));