Java 将request.getQueryString放入response.sendRedirect是否会使您容易受到HTTP响应拆分的攻击?

Java 将request.getQueryString放入response.sendRedirect是否会使您容易受到HTTP响应拆分的攻击?,java,security,http,servlets,Java,Security,Http,Servlets,我做了一个简单的JSP: <% response.sendRedirect(request.getQueryString()); %> 很明显,它不是很有用,但足以触发FindBugs警告,我也在我的真实JSP上看到: 这段代码直接将HTTP参数写入HTTP头,该头 允许HTTP响应拆分漏洞 然而,我很确定FindBugs在这里是错的。PergetQueryString不会对查询字符串进行解码,我认为编码的查询字符串不能包含CRLF,因为它必须位于请求行中。据我所知,C

我做了一个简单的JSP:

<%
    response.sendRedirect(request.getQueryString());
%>

很明显,它不是很有用,但足以触发FindBugs警告,我也在我的真实JSP上看到:

这段代码直接将HTTP参数写入HTTP头,该头 允许HTTP响应拆分漏洞

然而,我很确定FindBugs在这里是错的。Per
getQueryString
不会对查询字符串进行解码,我认为编码的查询字符串不能包含CRLF,因为它必须位于请求行中。据我所知,CRLF是不可能进去的

如果查询字符串为空,并且字符串将被解释为相对或非相对,则此玩具页面将出现问题,这可能不太好,但此处是否存在HTTP响应拆分漏洞


如果有,我们如何预防呢?

简短的回答是肯定的。但除了响应拆分(aka头或CRLF注入)之外,还有更多的安全问题。还有一个“未经验证的重定向”问题。攻击者可以通过您的站点将您的客户重定向到其他危险站点(钓鱼、利用漏洞等)


解决方案是创建一个白名单,并检查当前目标是否在白名单内。这防止了这两个问题。对值进行编码只是解决响应拆分问题的方法,但不能解决重定向问题。

响应拆分是如何发生的?基本上可以将%0D%0A作为换行符添加新的头,但这取决于jre、应用服务器和aso的其他保护。这不起作用。如果将
%0D%0A
放在查询字符串中,您将在位置中得到
%0D%0A
,因为如文档所述
getQueryString
不会对查询字符串进行解码,
sendRedirect
当然也不会对其进行解码。@SamuelWinward:但浏览器在发送之前会对其进行解码,有效地发送控制字符,这些字符包括在
getQueryString
sendRedirect
response.sendRedirect(“/example.do?”+request.getQueryString())中;这会导致开放重定向问题吗?因为我没有直接将request.getQueryString()传递给response.sendRedirect。