【问题标题】:How to fix veracode CWE-80 XSS issue while downloading the file?下载文件时如何修复veracode CWE-80 XSS问题?
【发布时间】:2020-12-22 06:23:39
【问题描述】:

以下是我现有的 Java 基本标准代码,如您所见,我只是使用输出流下载文件。

我只使用请求参数从标头中获取浏览器详细信息以生成文件名,然后我再次对其进行解码。

所以现在我不明白下面的代码是怎么回事

outputStream.write(data, 0, read);

会导致 XSS 问题吗?

那么,由于我的输出是一个简单的文件,我该如何解决这个问题?

        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 社区的答案,但它没有回答我的问题。

【问题讨论】:

    标签: java xss outputstream veracode


    【解决方案1】:

    Veracode 可能看到您没有进行任何编码,并认为这可能是 XSS 问题。

    但是,在这种情况下,不需要编码,因为它是文件下载,而不是 HTML 数据的生成。结果不会被浏览器解释为带有这些内容类型和标题的 HTML,因此这是一个误报警告。

    【讨论】:

      【解决方案2】:

      转换

      < → &lt;
      
      > → &gt;
      
      ' → &#39;
      
      " → &quot;
      
      & → &amp;
      

      代码:

      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("&lt;"); break;
               case '>': sb.append("&gt;"); break;
               case '&': sb.append("&amp;"); break;
               case '"': sb.append("&quot;"); break;
               default:  sb.append(c); break;
            }
         }
         return sb.toString();
      }
      

      【讨论】:

      • 感谢您的回答,我知道这种标准编码做法,但在这里我有文件对象而不是字符串对象,并且将字节转换为字符串也不是提高性能的好习惯,而且它也会损坏文件。那么还有其他相同的建议吗?
      • while ((readed = bufferInputStream.read(data)) != -1) { if (readed.equals('') .... ) { 已读 = stringToHtmlString(readed.toString()) } outputStream.write(data, 0, 已读); }
      • bufferInputStream.read 方法给我们的是整数值而不是字符串,所以我无法比较它。
      • 我会尝试比较,但即使它会起作用,它也会减慢下载过程。如果可行,我会在这里更新。
      • 如果它有效,请告诉我,如果有效,请将问题标记为已解决
      猜你喜欢
      • 2019-10-02
      • 2019-05-05
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 2017-12-10
      • 2018-07-07
      • 1970-01-01
      相关资源
      最近更新 更多