[英]Header Manipulation issue with HP Fortify in HTTP response [java]
我正在尝试修复此代码的 HP Fortify Scan 返回的“标题操作”问题。 我不知道文件在上传期间是否已经过验证(我认为没有)。 我尝试使用正则表达式来验证文件名,但没有成功。 任何人都可以帮助我吗?
b = uploadedFiles.getFilecontent().getBytes(1,
uploadedFiles.getFilesize().intValue());
if (b != null) {
response.reset();
String fileName = uploadedFiles.getFilename();
String header = "attachment; filename=\"" + fileName + "\"";
String contentType = uploadedFiles.getFilecontenttype();
response.setContentType(uploadedFiles.getFilecontenttype());
response.addHeader("Content-Transfer-Encoding", "Binary");
response.addHeader("Cache-Control", "must-revalidate, private");
response.setContentLength(b.length);
FileCopyUtils.copy(b, response.getOutputStream());
response.getOutputStream().flush();
response.getOutputStream().close();
}
我尝试了什么:
String fileName = uploadedFiles.getFilename();
String regex = "[a-zA-Z._ ]*";
if (b != null && fileName.matches(regex)) {
response.reset();
// String fileName = uploadedFiles.getFilename();
String header = "attachment; filename=\"" + fileName + "\"";
String contentType = uploadedFiles.getFilecontenttype();
response.setContentType(uploadedFiles.getFilecontenttype());
response.addHeader("Content-Transfer-Encoding", "Binary");
response.addHeader("Cache-Control", "must-revalidate, private");
response.setHeader("Content-Disposition", header);
response.setContentLength(b.length);
FileCopyUtils.copy(b, response.getOutputStream());
response.getOutputStream().flush();
response.getOutputStream().close();
}
您应该使用一种方法来过滤敏感信息
response.setHeader("Content-Disposition", header)
只是使用
fileName.matches(regex)
太简单了。
String contentType = uploadedFiles.getFilecontenttype();
response.setContentType(uploadedFiles.getFilecontenttype());
首先,您可以在此处修复冗余。 其次,问题可能来自您没有尝试验证内容类型这一事实。 如果内容类型已更改并且与文件不匹配怎么办? 每个用户输入都应该经过清理和/或与您实际期望的内容白名单进行比较。
编辑: filename
同上。 清理此字段
在这种情况下,您可以使用此方法验证标头值文件名
//Header manipulation
公共静态字符串 validateHeaders(字符串标头)抛出 UnsupportedEncodingException{
String filename = new String(header.getBytes("UTF-8"), "ISO-8859-1");
String regex = "[`~!@#$%^&*()\\+\\=\\{}|:\"?><\\/r\\/n]";
Pattern pa = Pattern.compile(regex);
Matcher ma = pa.matcher(filename);
if(ma.find()){
filename = ma.replaceAll("");
}
return filename;
}
字符串头=“附件;文件名=””+ validateHeaders(文件名)+“””;
通过使用 RestTemplate 并使用 HttpHeader 作为授权标头,下面的代码能够解决标头操作问题。
import org.apache.commons.lang3.StringUtils;
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headersNew = new HttpHeaders();
//Below 2 Line solve the problem
String sanitizedToken = StringUtils.normalizeSpace(yourJwtToken);
headersNew.setBearerAuth(sanitizedToken); //This line where fortify reporting issue earlier
String url ="Your url";
HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(null, headersNew);
ResponseEntity<Object> response =
restTemplate.exchange(url,
HttpMethod.GET,
entity,
Object.class);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.