Java “如何修复”;网页中与脚本相关的HTML标记的不正确中和(基本XSS)";在ServletOutputStream中

Java “如何修复”;网页中与脚本相关的HTML标记的不正确中和(基本XSS)";在ServletOutputStream中,java,xss,veracode,Java,Xss,Veracode,下面的代码在out.write(outByte,0,iRead)行中给出了veracode缺陷“网页中与脚本相关的HTML标记的不正确中和”; : 谢谢 根据@sinkmanu的建议,我尝试将字节转换为字符串。然后应用ESAPI.encoder().encodeForHTML() 我添加了两种转换方法: private static String base64Encode(byte[] bytes) { return new BASE64Encoder().encode(bytes); }

下面的代码在out.write(outByte,0,iRead)行中给出了veracode缺陷“网页中与脚本相关的HTML标记的不正确中和”; :

谢谢 根据@sinkmanu的建议,我尝试将字节转换为字符串。然后应用ESAPI.encoder().encodeForHTML()

我添加了两种转换方法:

private static String base64Encode(byte[] bytes) {
   return new BASE64Encoder().encode(bytes);
}
private static byte[] base64Decode(String s) throws IOException {
   return new BASE64Decoder().decodeBuffer(s);
}        
然后尝试使用以下代码:

上述方法可以解决veracode问题(当2未注释时),但映像似乎已损坏(不能再是进程了?)。
有任何关于如何使用二进制流解决veracode问题的提示吗?

您可以使用以下函数验证文件:
ESAPI.validator().getValidFileContent()

要清理字符串,可以使用ESAPI库中的encodeForHTML或Apache中的StringEscapeUtils

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
String data = "<script>alert(document.cookie);</script>";
String escaped = escapeHtml(data);
import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
String data=“警报(document.cookie);”;
转义字符串=转义HTML(数据);
如果数据不是字符串,则必须将其转换为字符串。此外,如果您确定已转义数据,则可以忽略该警告,因为它是假阳性。

上述解决方案如下:
在ESAPI LIB中,还有从Base64编码和解码的方法。这就是我问题的解决办法。以上两行代码对veracode来说很神奇,当以后在代码中使用“safeBytes”时,一切都很好……

也许可以解释一下为什么验证文件可以修复此错误?
bytes = helper.getBlob( inId );

// 1 -> this solves Veracode issue but image is not valid anymore
String encodedString = base64Encode(bytes) ; 
String safeString = ESAPI.encoder().encodeForHTML(encodedString);
safeBytes = base64Decode(safeString);

// 2 -> as written above, when i use the safe 'safeBytes' the Veracode flaw is gone but the app is not working anymore (image not ok)
// ByteArrayInputStream bin = new ByteArrayInputStream(safeBytes);
// outBytes = new byte[safeBytes.length];

// 3 -> just use the 'unsafe' bytes -> app is working but veracode flaw needs to be fixed!
ByteArrayInputStream bin = new ByteArrayInputStream(bytes);
outBytes = new byte[bytes.length];

int iRead=0;
ServletOutputStream out = response.getOutputStream();

while ((iRead = bin.read(outBytes)) > 0) {
    out.write(  outBytes, 0, iRead); 
}           
import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
String data = "<script>alert(document.cookie);</script>";
String escaped = escapeHtml(data);
    String safeString = ESAPI.encoder().encodeForBase64(bytes,false);
    byte[] safeBytes = ESAPI.encoder().decodeFromBase64(safeString);