首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC、Fortify和试用-

JDBC、Fortify和试用-
EN

Stack Overflow用户
提问于 2015-12-07 17:35:49
回答 2查看 1.7K关注 0票数 2

我目前正在执行一个项目,该项目正在使用HP的Fortify SCA工具来捕捉代码库中的安全问题。我在确定正确处理JDBC资源的最佳方法方面存在一些问题。

我现在的代码是这样的;

代码语言:javascript
复制
    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);,在这种情况下所有的资源都将被正确关闭,并且我已经选择了指示这一点的答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-07 22:26:59

使用“使用资源的尝试”是始终支持的Java7和更高版本的,不管工具在上面。

因此,如果这段代码编译(意思是您在Java7+上),您可以安全地忽略任何警告,因为它们确实是假的。保证JRE类的自动关闭资源契约。

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

票数 3
EN

Stack Overflow用户

发布于 2015-12-18 21:44:20

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

此外,你应该标记这个和其他相同的发现“不是一个问题”,并继续你的生活。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34139717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档