我在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`
1条答案
按热度按时间ycl3bljg1#
你应该使用
HttpServletResponse.encodeRedirectURL()
要对重定向URL进行编码:字符串url(字符串url)
对指定的url进行编码以用于
sendRedirect
方法,或者,如果不需要编码,则返回不变的url。该方法的实现包括确定会话id是否需要在url中编码的逻辑。...
所有发送到
HttpServletResponse.sendRedirect
方法应该通过此方法运行。。。这应该起作用:
由于您的url实际上不需要编码,因此
encodeRedirectURL()
将:重定向也能正常工作。
编辑:
显然提出的解决方案仍然会触发
HRS_REQUEST_PARAMETER_TO_HTTP_HEADER
spotbug错误。在做了更多的研究之后,我发现这个错误是为了防止http响应分裂漏洞(即当不需要的时候)
\r\n
写在http响应的头部分)。我们最好消毒一下
relayState
针对这种漏洞。一个简单的
relayState.replace("\r\n", "")
足以消除错误: