Наше приложение использует 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, поэтому мы не можем использовать «попробуйте-с-ресурсов»)
Фактическое сканирование не вдаваться в подробности, почему две разные - поэтому, предполагая, что все другие вещи, связанные с использованием приложения, совпадают (и насколько я могу судить по ним), какая у него причина для сообщения о проблеме безопасности в одном случае, а не в другом?
Код синтаксически некорректным. Java чувствительна к регистру, поэтому 'If',' Try' и 'finally' ошибочны. В дополнение к этому код ужасен и другими способами. Например, используя 'Statement' вместо' PreparedStatement', пустые блоки catch ... Вы можете использовать 'try-with-resources', чтобы сделать как корректные **, так и ** намного приятнее, но я предполагаю, что вы используете некоторые устаревшие версии Java. – Kayaman
Плохой корпус - это случай «Я помещал это в word doc перед публикацией и не мог потрудиться, чтобы удалить корпус», но я его отредактирую. И «утверждение» взято из примера сканирования. Я также правильно записал свой код функционирования, но оставил все, потому что у него были данные, чувствительные к безопасности. И да, мы застряли в 1.4, так что, к сожалению, мы пока не можем использовать try-with-resourses. – Zibbobz
Ах, ужасы устаревшего кода .. – Kayaman