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 语句中发生异常,那么引用 connps会丢失,无法正常关闭。 fortify 是否正确地标记这个或者它是一个误报?根据我的理解,try-with-resource 应该 总是关闭他们的资源,但是 perhaps 当他们像这样嵌套时,这并不总是发生。

我已经在 Internet 上搜索了其他相关问题和博客,但我还没有得到任何明确的证据。

在这种情况下始终安全的记录最多的解决方案是不使用 try-with-resource 并在更广泛的 try-catch 语句的 catch 和 finally 块中用 try-catch 包装每个资源。但是,我宁愿避免这种情况,因为它非常冗长。

提前致谢!

编辑:所以我意识到在将代码重写成 SO 时遗漏了一些代码。原始的 catch 块中有一个 System.exit(1); 语句(我知道这是不好的做法)。这意味着如果在嵌套的 try-with-resource 中抛出异常,那么 Fortify 会正确地说 connps 不会正确关闭。

感谢您的回复,没有 System.exit(1); 这种情况下的所有资源 正确关闭,我选择的答案表明。

使用 try-with-resource 始终 在 Java 7 及更高版本上受支持,无论工具是否位于其之上。

因此,如果此代码编译通过(意味着您处于 Java7+),您可以安全地忽略任何警告,因为它们确实是误报。 JRE 类.

保证自动关闭资源契约

现在,如果您决定编写自己的实现 AutoCloseable 的资源,那么您需要确保 close() 方法实际关闭资源 =)

Fortify Java 翻译器可能从未使用此 Java 7+ 构造进行更新。您应该联系 Fortify 技术支持并提交测试用例。分析不正确。

此外,您应该标记这个和其他相同的发现 "Not an Issue" 并继续您的生活。