如何修复Fortify检出的Java Header Manipulation请求头操纵漏洞?
Header Manipulation 漏洞修复方案
漏洞触发原因
Fortify 检出该漏洞的核心原因是:请求头、请求URL属于完全用户可控的不可信输入,未经过校验/过滤直接使用时,攻击者可插入\r、\n等换行字符,篡改后续生成的HTTP响应头结构,触发Cookie篡改、恶意跳转等风险。
最优修复步骤
- 优先做严格格式校验
明确MyID的业务规则,比如是UUID、数字、固定长度的字母数字组合,用正则表达式做强校验,不符合规则的请求直接拦截返回400错误。
示例代码:// 示例:MyID为32位十六进制字符串的校验规则 String myId = requestServlet.getHeader("MyID"); // 正则可根据实际业务规则调整 Pattern validMyIdPattern = Pattern.compile("^[a-fA-F0-9]{32}$"); if (myId == null || !validMyIdPattern.matcher(myId).matches()) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); return; } // 请求URL也可根据业务场景校验域名、路径规则 String requestUrl = requestServlet.getRequestURL().toString(); if (!requestUrl.startsWith("https://你的合法域名前缀")) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); return; } - 无法限定格式时做危险字符过滤
如果业务场景不支持做强格式校验,必须接收任意输入,直接移除所有换行类危险字符即可,这类字符是请求头操纵的核心 payload 载体:
示例工具方法:
使用方式:public static String filterUnsafeHeaderChars(String input) { if (input == null) { return null; } // 移除回车、换行以及对应URL编码形式,避免编码绕过 return input.replaceAll("[\r\n%0d%0a]", ""); }String myId = filterUnsafeHeaderChars(requestServlet.getHeader("MyID")); String a = filterUnsafeHeaderChars(requestServlet.getRequestURL().toString()); - 后续使用场景额外防护
如果要把上述参数放到HTTP响应头中,优先使用Servlet容器自带的setHeader类API,不要手动拼接响应头字符串,Tomcat 8+、Jetty 9+等新版本容器已经内置响应头换行校验,发现非法字符会直接抛出异常阻断风险。
误报说明
如果业务逻辑中读取上述参数仅用于内部业务计算、数据库查询(已做SQL注入防护),完全不会用于生成HTTP响应头/重定向地址,可提交上下文说明给安全团队确认误报,无需额外修改。
内容的提问来源于stack exchange,提问作者Bilgehan
相关产品推荐
相关产品推荐

