我们的应用程序使用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,因此我们无法使用"尝试使用资源")
实际扫描没有详细说明为什么两者不同 - 所以假设关于应用程序使用连接的所有其他事情是相同的(并且它们是我可以告诉的),是什么原因会它有报告一个案例中的安全问题,而不是另一个案例?
答案 0 :(得分:1)
if(conn != null){
try{
conn.commit ();
conn.Close(); // report indicates an issue here
}catch SQLException{}
如果conn.close()
抛出conn.commit()
,或者任何其他异常,则SQLException
将不会被执行。
正如您所猜测的那样,将其移至finally
如果在其他情况下解决问题则应解决问题。
此外,由于Connection
为AutoCloseable
,因此请考虑使用try-with-resources