Inyección en Hibernate con SQL
- Área: Codificación y Validación de entrada/salida
- Carácter del recurso: Obligatorio
- Tecnologías: Java
Descripción
En ocasiones usar Hibernate para la ejecución de instrucciones dinámicas de SQL construidas a partir de las entradas controladas por el usuario puede permitir al atacante modificar el significado de la ejecución arbitraria de los comandos SQL.
Ejemplos
En el siguiente ejemplo, se utiliza la sintaxis HQL para construir una consulta dinámica de SQL que es vulnerable a la inyección.
String street = getStreetFromUser();
Query query = session.createQuery("from Address a where a.street='" + street + "'");
Para mitigarlo es recomendable el uso de una lista blanca de control sobre cualquier entrada de usuario que se puede utilizar en un comando SQL. Una manera segura de construir la consulta anterior sería:
String street =getStreetFromUser();
//validateWhiteList -> método que valida que el parámetro que se le pasa, encaja con la lista blanca.
if(validateWhiteList(street)){
Address address = (Address) session.find("from Address as a where a.street = ?", street, String);
}else{
//Lanza un error si street no encaja la lista blanca
}
En lugar de filtrar meta-caracteres, es más seguro no permitirlos en su totalidad. Esto es debido a que el uso posterior de los datos que han sido inscritos en la base de datos puede descuidar el filtrar los meta-caracteres antes de su uso.
Definir el conjunto de caracteres de seguridad basado en el valor esperado del parámetro en la petición.
Contenidos relacionados
Código | Título | Tipo | Carácter | |
---|---|---|---|---|
LIBP-0276 | Inyección de código basada en SQL | Libro de pautas | Directriz | Obligatoria |
LIBP-0255 | Validación de los datos de entrada | Libro de pautas | Directriz | Obligatoria |