强化安全问题“未发布的资源流”

pur*_*man 2 java security inputstream

我在下面的代码中得到了“未发布的资源流”的强化发现。

Resource[] l_objResource = resourceLoader.getResources(configErrorCode);
Properties l_objProperty = null;
for (int i = 0; i < l_objResource.length; i++) {
    l_objProperty = new Properties();
    l_objProperty.load(l_objResource[i].getInputStream());
}
Run Code Online (Sandbox Code Playgroud)

该函数loadErrorCode()有时BaseErrorParser.java无法释放由getInputStream();

任何人都可以解释这一发现或帮助解决问题吗?


来自下面的评论,但上下文不清楚(JW):

ObjectInputStream l_objObjInputStream = null;
Map l_mapRet = null;
try {
    l_objObjInputStream = new ObjectInputStream(new FileInputStream(p_objFilename));
    Object l_objTemp = l_objObjInputStream.readObject();
    l_mapRet = (Map) l_objTemp;
} finally {
    if (l_objObjInputStream != null) {
        l_objObjInputStream.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

您没有关闭由以下代码行打开的输入流

l_objResource[i].getInputStream();
Run Code Online (Sandbox Code Playgroud)

如果有任何输入或输出流在使用后打开但未关闭,通常强化扫描仪会报告未释放的资源流问题。处理这些问题的理想方法是关闭finally块中所有打开的流,这样即使在异常情况下它们也不会产生任何问题。

您可以尝试 -finally 阻止代码并关闭流,如下所示。

Resource[] l_objResource = resourceLoader.getResources(configErrorCode);
Properties l_objProperty = null;
InputStream is = null;
for (int i = 0; i < l_objResource.length; i++) {
    l_objProperty = new Properties();
    try {
          is = l_objResource[i].getInputStream();
          l_objProperty.load(is);
    } finally {
          if(is!=null) {
              is.close();
          }
    }
}
Run Code Online (Sandbox Code Playgroud)

请检查它是否适用于您的情况。