2016-01-15 10 views
0

Наше приложение использует HP Fortify для сканирования уязвимостей безопасности. Одной из уязвимостей, обнаруженных ею, является уязвимость Unreleased Resource: Database.Почему мой диагностический прибор все еще сообщает об ошибке безопасности?

Абстрактный предлагает как решение:

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

Код синтаксически некорректным. Java чувствительна к регистру, поэтому 'If',' Try' и 'finally' ошибочны. В дополнение к этому код ужасен и другими способами. Например, используя 'Statement' вместо' PreparedStatement', пустые блоки catch ... Вы можете использовать 'try-with-resources', чтобы сделать как корректные **, так и ** намного приятнее, но я предполагаю, что вы используете некоторые устаревшие версии Java. – Kayaman

+0

Плохой корпус - это случай «Я помещал это в word doc перед публикацией и не мог потрудиться, чтобы удалить корпус», но я его отредактирую. И «утверждение» взято из примера сканирования. Я также правильно записал свой код функционирования, но оставил все, потому что у него были данные, чувствительные к безопасности. И да, мы застряли в 1.4, так что, к сожалению, мы пока не можем использовать try-with-resourses. – Zibbobz

+1

Ах, ужасы устаревшего кода .. – Kayaman

ответ

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

+0

Как я уже сказал в своем вопросе, я попытался точно так же, как вы сказали (инкапсулированный отдельным методом), и он все еще сообщает об этой проблеме. Кроме того, я на 1.4, поэтому я не могу использовать try-with-resourses, но я добавлю, что, поскольку я упоминал об этом только в комментариях – Zibbobz

 Смежные вопросы

  • Нет связанных вопросов^_^