【问题标题】:JDBC, Fortify and Try-With-ResourceJDBC、Fortify 和 Try-With-Resource
【发布时间】:2016-03-12 10:02:45
【问题描述】:

我目前正在处理一个项目,该项目使用 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 的引用将丢失,并且它们不会被正确关闭。强化标记是正确的还是误报?据我了解,try-with-resource 应该总是关闭他们的资源,但当他们像这样嵌套时,这可能并不总是发生。

我已经搜索了互联网上的其他相关问题和博客,但我无法获得任何明确的证据。

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

提前致谢!

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

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

【问题讨论】:

  • 这个 Fortify 工具是否甚至支持 Java 7 或更高版本,因为它的分析是错误的。

标签: jdbc fortify try-with-resources


【解决方案1】:

Fortify Java 翻译器可能永远不会使用这个 Java 7+ 结构进行更新。您应该联系 Fortify 技术支持并提交测试用例。分析不正确。

此外,您应该将此和其他相同的发现标记为“不是问题”并继续您的生活。

【讨论】:

    【解决方案2】:

    在 Java 7 及更高版本上始终支持使用 try-with-resource,无论上面是否有工具。

    因此,如果此代码编译(意味着您使用的是 Java7+),您可以放心地忽略任何警告,因为它们确实是误报。 JRE 类保证自动关闭资源契约。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多