为什么 java.sql.ResultSet.getString 是信息泄漏漏洞

信息安全 爪哇 数据库
2021-09-07 06:47:29

最近我开始使用 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);
  }
 }
}
2个回答

原因可能是 ResultSet.getString 和 RestulSet.getObject 应该返回一个有效的结果,无论您指定的列的基础值是什么。因此,如果发生 SQLi 攻击并且第 1 列通常是一个字符串,但现在是某个秘密数字,那么您仍然会得到一个有效的结果,从而泄露有关该结果的信息。而 ResultSet.getDate 如果无法将列解析为日期,则会引发异常,因此不会泄露任何信息,除非它是无效值。

除了 jcopenha 的回答,也许您可​​以尝试使用 getString("column label")。如果表格式发生变化并且列索引发生偏移,如果您使用标签(选择名称为 n),那么使用 getString("n") 引用应该确保您得到 'n' 回来。更重要的是,如果您使用与表列命名约定不同的标签约定,则两者永远不应重叠。