Perché java.sql.ResultSet.getString è una vulnerabilità di perdita di informazioni

10

Recentemente ho iniziato a utilizzare LAPSE + per l'analisi del codice statico e continuava a puntare java.sql.ResultSet.getString come perdita di informazioni. Il ResultSet viene chiuso correttamente dopo il suo utilizzo.

LAPSE + lo fa solo per ResultSet.getString() e ResultSet.getObject() . Ad esempio, ResultSet.getDate() non viene considerato come vulnerabilità. Questo comportamento conferma questa pagina OWASP , che indica come vulnerabili solo i due getter in ResultSet .

Sto cercando di capire il motivo alla base di questo. Ha qualcosa a che fare con le stringhe che sono immutabili?

Sebbene non sia la cosa esatta (a causa di motivi di riservatezza), di seguito è riportato un esempio di blocco di codice che mi preoccupa:

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);
  }
 }
}
    
posta drox 10.01.2016 - 05:53
fonte

2 risposte

1

Il ragionamento potrebbe essere che ResultSet.getString e RestulSet.getObject devono restituire un risultato valido, indipendentemente dal valore sottostante per la colonna specificata. Quindi, se c'è stato un attacco SQLi e la colonna 1 è di solito una stringa, ma ora è un numero segreto, otterrete comunque un risultato valido e quindi informazioni di perdita su quel risultato. Considerando che ResultSet.getDate genererà un'eccezione se non è in grado di analizzare la colonna come una data, quindi nessuna informazione verrebbe divulgata, a parte il valore non valido.

    
risposta data 29.04.2016 - 01:42
fonte
0

Oltre alla risposta di jcopenhan, forse potresti provare a usare getString ("etichetta di colonna"). Se il formato della tabella cambia e gli indici delle colonne sono sfalsati, se si utilizzano le etichette (selezionare il nome come n), fare riferimento a getString ("n") dovrebbe garantire di ottenere 'n' indietro. Più precisamente, se si utilizza una convenzione per le etichette che differisce dalla convenzione di denominazione delle colonne della tabella, le due non dovrebbero mai sovrapporsi.

    
risposta data 08.12.2016 - 09:08
fonte

Leggi altre domande sui tag