最近我开始使用 LAPSE+ 进行静态代码分析,它一直指向java.sql.ResultSet.getString信息泄漏。使用ResultSet后正确关闭。
LAPSE+ 仅对ResultSet.getString()和执行此操作ResultSet.getObject()。例如,ResultSet.getDate()不被视为漏洞。这种行为证实了这个 OWASP 页面,它表明只有这两个 getterResultSet是易受攻击的。
我试图找出这背后的原因。它与字符串不可变有关吗?
虽然不是确切的事情(由于保密原因),但以下是我关心的示例代码块:
ResultSet rs = null;
try {
dbConnection = dataSource.getConnection();
prepStmt = dbConnection.prepareStatement("SELECT NAME, DOB FROM CUSTOMERS WHERE ID=?");
prepStmt.setInt(1, customerId);
rs = prepStmt.executeQuery();
//do something
while (rs.next()) {
String name = rs.getString(1);
Date dob = rs.getDate(2);
//do something
}
} catch (SQLException e) {
//do something
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
log.error("Database error. Could not close result set - " + e.getMessage(), e);
}
}
}