Por qué java.sql.ResultSet.getString es una vulnerabilidad de fuga de información

10

Recientemente comencé a usar LAPSE + para el análisis de código estático y seguí apuntando a java.sql.ResultSet.getString como una fuga de información. El ResultSet está correctamente cerrado después de su uso.

LAPSE + hace esto solo para ResultSet.getString() y ResultSet.getObject() . Por ejemplo, ResultSet.getDate() no se toma como una vulnerabilidad. Este comportamiento confirma a esta página OWASP , que indica solo a esos dos captadores en ResultSet como vulnerables.

Estoy tratando de averiguar la razón detrás de esto. ¿Tiene algo que ver con que las cuerdas sean inmutables?

Aunque no es lo exacto (debido a razones de confidencialidad), a continuación se muestra un bloque de código de muestra que me preocupa:

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

2 respuestas

1

El razonamiento podría haber sido que ResultSet.getString y RestulSet.getObject deberían devolver un resultado válido sin importar cuál sea el valor subyacente para la columna que especifique. Entonces, si hubo un ataque SQLi y la columna 1 es generalmente una cadena pero ahora es un número secreto, obtendrá un resultado válido y, por lo tanto, filtrará información sobre ese resultado. Mientras que ResultSet.getDate lanzará una excepción si no puede analizar la columna como una fecha, por lo que no se filtrará ninguna información que no sea un valor no válido.

    
respondido por el jcopenha 29.04.2016 - 01:42
fuente
0

Además de la respuesta de jcopenha, quizás podrías intentar usar getString ("etiqueta de columna"). Si el formato de la tabla cambia y los índices de las columnas están desplazados, si usa las etiquetas (seleccione el nombre como n), las referencias con getString ("n") deben asegurarse de obtener la respuesta "n". Más al punto, si utiliza una convención de etiqueta que difiere de la convención de nomenclatura de columnas de la tabla, las dos nunca se deben superponer.

    
respondido por el Ed Neville 08.12.2016 - 09:08
fuente

Lea otras preguntas en las etiquetas