我目前正在执行一个项目,该项目正在使用HP的Fortify SCA工具来捕捉代码库中的安全问题。我在确定正确处理JDBC资源的最佳方法方面存在一些问题。
我现在的代码是这样的;
try (Connection conn = new DatabaseService().getConnection();
PreparedStatement ps = conn.prepareStatement(query);) {
ps.setString(1, mString);
try (ResultSet rs = ps.executeQuery();) {
while (rs.next()) {
...Do logic...
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (SQLException e){
e.printStackTrace();
}
}问题是,Fortify将标记此代码,声明如果嵌套try语句中出现异常,那么对、conn、和ps的引用将丢失,它们将无法正确关闭。防御工事是正确的标记,还是假阳性?据我所知,资源尝试应该总是关闭他们的资源,但也许这种情况并不总是发生在像这样嵌套的情况下。
我已经在互联网上搜索过其他相关的问题和博客,但是我还没有得到任何明确的证据。
在这种情况下,最安全的解决方案是不使用具有资源的尝试-捕获,并在更广泛的try-catch语句的catch和最终块中使用try-catch来包装每个资源。然而,我宁愿避免这样做,因为它非常冗长。
提前感谢!
编辑:所以当我将代码重写为代码时,我意识到代码中遗漏了一些东西。原始的catch块中有一个System.exit(1);语句(我知道这种做法很糟糕)。这意味着,如果在嵌套的试用资源中抛出异常,那么Fortify将正确地说、conn、和ps将无法正确关闭。
谢谢您的回复,如果没有System.exit(1);,在这种情况下所有的资源都将被正确关闭,并且我已经选择了指示这一点的答案。
发布于 2015-12-07 22:26:59
使用“使用资源的尝试”是始终支持的Java7和更高版本的,不管工具在上面。
因此,如果这段代码编译(意思是您在Java7+上),您可以安全地忽略任何警告,因为它们确实是假的。保证JRE类的自动关闭资源契约。
现在,如果您决定编写实现AutoCloseable的自己的资源,那么要确保close()方法实际上关闭了资源=)
发布于 2015-12-18 21:44:20
Fortify Java翻译器可能从未使用此Java7+结构进行更新。您应该联系Fortify技术支持并提交测试用例。这个分析是不正确的。
此外,你应该标记这个和其他相同的发现“不是一个问题”,并继续你的生活。
https://stackoverflow.com/questions/34139717
复制相似问题