为什么我的扫描工具仍然报告安全问题?

时间:2016-01-15 19:42:22

标签: java security iso fortify

我们的应用程序使用HP Fortify扫描安全漏洞。发现的一个漏洞是未发布的资源:数据库漏洞。

摘要表明这是一个解决方案:

public void execCxnSql(Connection conn) {

Statement stmt;

try {

stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(CXN_SQL);

...

}

finally {

if (stmt != null) {

safeClose(stmt);

}

}

}

public static void safeClose(Statement stmt) {

if (stmt != null) {

try {

stmt.close();

} catch (SQLException e) {

log(e);

}

}

}

我已经在以下类型的数据库连接关闭方面取得了一些成功:

if(conn != null){

try{

    conn.rollback();

    conn.Close(); // Report indicates an issue here

}catch SQLException{}

将其转化为:

if(conn != null){

try{

    conn.rollback();

}catch SQLException{}

finally{

safeClose(conn);  //Issue no longer reported

}



public static void safeClose(Connection stmt) {

if (stmt != null) {

try {

stmt.close();

} catch (SQLException e) {

log(e);

}

}

}

(注意:“连接”是SQL数据库连接)

但是,在这种类型的数据库闭包上尝试相同的修复:

if(conn != null){

try{

    conn.commit ();

    conn.Close(); // report indicates an issue here

}catch SQLException{}

不会从我们的安全扫描中删除此问题。

if(conn != null){

try{

    conn.commit();

}catch SQLException{}

finally{

safeClose(conn); // Issue not resolved

}

(请注意我们的应用是Java 1.4,因此我们无法使用"尝试使用资源")

实际扫描没有详细说明为什么两者不同 - 所以假设关于应用程序使用连接的所有其他事情是相同的(并且它们是我可以告诉的),是什么原因会它有报告一个案例中的安全问题,而不是另一个案例?

1 个答案:

答案 0 :(得分:1)

if(conn != null){

try{

    conn.commit ();

    conn.Close(); // report indicates an issue here

}catch SQLException{}

如果conn.close()抛出conn.commit(),或者任何其他异常,则SQLException将不会被执行。

正如您所猜测的那样,将其移至finally如果在其他情况下解决问题则应解决问题。

此外,由于ConnectionAutoCloseable,因此请考虑使用try-with-resources