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

问题描述 投票:1回答:1

我在下面的代码中找到了“Unreleased resource stream”的强化发现。

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());
}

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();
    }
}
java security inputstream
1个回答
3
投票

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

l_objResource[i].getInputStream();

通常强化扫描程序报告如果有任何输入或输出流在使用后打开但未关闭,则会发布未发布的资源流问题。处理这些问题的理想方法是关闭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();
          }
    }
}

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


0
投票

您可以在此处使用Try with resource。这将自动关闭您的信息流。

Map l_mapRet = null;
try (ObjectInputStream l_objObjInputStream = new ObjectInputStream(new FileInputStream(p_objFilename))){
    Object l_objTemp = l_objObjInputStream.readObject();
    l_mapRet = (Map) l_objTemp;
} Catch(IOException E){
// Handle exception
}
© www.soinside.com 2019 - 2024. All rights reserved.