JDBC,强化和尝试资源
JDBC, Fortify and Try-With-Resource
我目前正在完成一个项目,该项目使用 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会丢失,无法正常关闭。 fortify 是否正确地标记这个或者它是一个误报?根据我的理解,try-with-resource 应该 总是关闭他们的资源,但是 perhaps 当他们像这样嵌套时,这并不总是发生。
我已经在 Internet 上搜索了其他相关问题和博客,但我还没有得到任何明确的证据。
在这种情况下始终安全的记录最多的解决方案是不使用 try-with-resource 并在更广泛的 try-catch 语句的 catch 和 finally 块中用 try-catch 包装每个资源。但是,我宁愿避免这种情况,因为它非常冗长。
提前致谢!
编辑:所以我意识到在将代码重写成 SO 时遗漏了一些代码。原始的 catch 块中有一个 System.exit(1);
语句(我知道这是不好的做法)。这意味着如果在嵌套的 try-with-resource 中抛出异常,那么 Fortify 会正确地说 conn 和 ps 不会正确关闭。
感谢您的回复,没有 System.exit(1);
这种情况下的所有资源 将 正确关闭,我选择的答案表明。
使用 try-with-resource 始终 在 Java 7 及更高版本上受支持,无论工具是否位于其之上。
因此,如果此代码编译通过(意味着您处于 Java7+),您可以安全地忽略任何警告,因为它们确实是误报。 JRE 类.
保证自动关闭资源契约
现在,如果您决定编写自己的实现 AutoCloseable
的资源,那么您需要确保 close()
方法实际关闭资源 =)
Fortify Java 翻译器可能从未使用此 Java 7+ 构造进行更新。您应该联系 Fortify 技术支持并提交测试用例。分析不正确。
此外,您应该标记这个和其他相同的发现 "Not an Issue" 并继续您的生活。
我目前正在完成一个项目,该项目使用 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会丢失,无法正常关闭。 fortify 是否正确地标记这个或者它是一个误报?根据我的理解,try-with-resource 应该 总是关闭他们的资源,但是 perhaps 当他们像这样嵌套时,这并不总是发生。
我已经在 Internet 上搜索了其他相关问题和博客,但我还没有得到任何明确的证据。
在这种情况下始终安全的记录最多的解决方案是不使用 try-with-resource 并在更广泛的 try-catch 语句的 catch 和 finally 块中用 try-catch 包装每个资源。但是,我宁愿避免这种情况,因为它非常冗长。
提前致谢!
编辑:所以我意识到在将代码重写成 SO 时遗漏了一些代码。原始的 catch 块中有一个 System.exit(1);
语句(我知道这是不好的做法)。这意味着如果在嵌套的 try-with-resource 中抛出异常,那么 Fortify 会正确地说 conn 和 ps 不会正确关闭。
感谢您的回复,没有 System.exit(1);
这种情况下的所有资源 将 正确关闭,我选择的答案表明。
使用 try-with-resource 始终 在 Java 7 及更高版本上受支持,无论工具是否位于其之上。
因此,如果此代码编译通过(意味着您处于 Java7+),您可以安全地忽略任何警告,因为它们确实是误报。 JRE 类.
保证自动关闭资源契约现在,如果您决定编写自己的实现 AutoCloseable
的资源,那么您需要确保 close()
方法实际关闭资源 =)
Fortify Java 翻译器可能从未使用此 Java 7+ 构造进行更新。您应该联系 Fortify 技术支持并提交测试用例。分析不正确。
此外,您应该标记这个和其他相同的发现 "Not an Issue" 并继续您的生活。