fix-for-spot-bug-hrs\u-request\u-parameter\u-to\u-http\u头

r55awzrz  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(298)

我在servlet中执行下面的代码,并得到这个点bug-hrs\u request\u parameter\u to\u http\u header bug:http参数直接写入ssoidlogoutrediredirect.dopost中的http header输出(httpservletrequest,httpservletresponse)

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

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

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

但是url没有以正确的方式重定向,因为我可以看到relaystate url在编码原始relaystate=https://sad.ezhdj.net/system/web/apps/dfgh/ 经过编码之后
relaystate=https%3a%2f%2fsad.ezdev.net%2fsystem%2fweb%2fapps%2fdfgh%2f`

ycl3bljg

ycl3bljg1#

你应该使用 HttpServletResponse.encodeRedirectURL() 要对重定向URL进行编码:
字符串url(字符串url)
对指定的url进行编码以用于 sendRedirect 方法,或者,如果不需要编码,则返回不变的url。该方法的实现包括确定会话id是否需要在url中编码的逻辑。
...
所有发送到 HttpServletResponse.sendRedirect 方法应该通过此方法运行。。。
这应该起作用:

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

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

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

重定向也能正常工作。
编辑:
显然提出的解决方案仍然会触发 HRS_REQUEST_PARAMETER_TO_HTTP_HEADER spotbug错误。
在做了更多的研究之后,我发现这个错误是为了防止http响应分裂漏洞(即当不需要的时候) \r\n 写在http响应的头部分)。
我们最好消毒一下 relayState 针对这种漏洞。
一个简单的 relayState.replace("\r\n", "") 足以消除错误:

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

相关问题