Java 如何在下载文件时修复veracode CWE-80 XSS问题?
下面是我现有的Java基本标准代码,您可以看到,我只是使用输出流下载文件 我只是使用request参数从标题中获取浏览器详细信息以生成文件名,然后再次对其进行解码 所以现在我不明白下面的代码是怎么写的 outputStream.write(数据,0,读取) 是否会导致XSS问题 那么,由于我的输出是一个简单的文件,如何解决这个问题呢Java 如何在下载文件时修复veracode CWE-80 XSS问题?,java,xss,outputstream,veracode,Java,Xss,Outputstream,Veracode,下面是我现有的Java基本标准代码,您可以看到,我只是使用输出流下载文件 我只是使用request参数从标题中获取浏览器详细信息以生成文件名,然后再次对其进行解码 所以现在我不明白下面的代码是怎么写的 outputStream.write(数据,0,读取) 是否会导致XSS问题 那么,由于我的输出是一个简单的文件,如何解决这个问题呢 OutputStream outputStream = httpResponse.getOutputStream(); InputS
OutputStream outputStream = httpResponse.getOutputStream();
InputStream fileInputStream = generateInputStreamObj(user, attachmentObj, false, httpRequest, servletContext, ipAddress);
String userAgent = httpRequest.getHeader("User-Agent");
String encodedFileName = generateFileName(userAgent, attachmentObj);
int downloadBufferSize = Integer.parseInt(CacheManagement.getInstance().getSystemPropertyByAlias().get("DOWNLOAD_BUFFER_SIZE").getPropertyValue());
httpResponse.setContentType("application/x-download");
httpResponse.setHeader("Content-Length", String.valueOf(attachmentObj.getDocumentSize()));
httpResponse.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
httpResponse.setBufferSize(downloadBufferSize);
bufferInputStream = new BufferedInputStream(fileInputStream);
byte[] data = new byte[downloadBufferSize];
int readed = 0;
while ((readed = bufferInputStream.read(data)) != -1)
{
outputStream.write(data, 0, readed);
}
我检查堆栈溢出和Veracode答案,但这对我没有帮助
**如果你要把这个问题改成负数,请发表评论。我查看了stackoverflow和veracode社区答案,但它没有回答我的问题。
< → <
> → >
' → '
" → "
& → &
<→
> →
' → '
" → "
& → &;
代码:
public静态最终字符串stringToHtmlString(字符串s){
StringBuffer sb=新的StringBuffer();
int n=s.长度();
对于(int i=0;iVeracode可能看到您没有进行任何编码,并认为这可能是XSS的问题
但是,在这种情况下,不需要编码,因为这是一个文件下载,而不是HTML数据的生成。结果不会被浏览器解释为带有这些内容类型和标题的HTML,因此这是一个误报警告。谢谢您的回答,我知道这个标准编码实践,但这里我有文件对象而不是字符串对象并将字节转换为字符串对于性能来说也是不好的做法,而且它也会损坏文件。那么有没有其他建议呢?while((readed=bufferInputStream.read(data))!=-1){if(readed.equals(“”){readed=stringToHtmlString(readed.toString())}outputStream.write(data,0,readed);}bufferInputStream.read方法为我们提供的是整数值而不是字符串,因此我无法对其进行比较。提供整数,但它是ASCII代码。我将尝试进行比较,但即使它可以工作,也会减慢下载过程。如果可行,我将在此处更新。
public static final String stringToHtmlString(String s){
StringBuffer sb = new StringBuffer();
int n = s.length();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
switch (c) {
case '<': sb.append("<"); break;
case '>': sb.append(">"); break;
case '&': sb.append("&"); break;
case '"': sb.append("""); break;
default: sb.append(c); break;
}
}
return sb.toString();
}