reales inyeccion injection example ejemplos contramedidas codigo java sql hibernate spring-mvc sql-injection

java - inyeccion - Cómo se detiene normalmente la inyección SQL en una configuración de Spring/Hibernate



sql injection java (2)

Odio el lenguaje de Ruby porque no está escrito de forma estática, pero cuanto más tiempo paso con Spring / Hibernate, aprecio más las características de Ruby on Rails. Específicamente el hecho de que su modelo de registro activo evita la inyección de SQL para usted. ¿Cómo se maneja este problema normalmente con una pila Spring / Hibernate? ¿Alguno de los dos viene con un conjunto de herramientas de limpieza de algún tipo, para asegurarse de que su entrada de usuario sea segura?

Esto no es un gran problema en un inserto si solo está insertando DAO, pero es un problema importante cuando se usan las declaraciones Select.


Creo que ha respondido a su propia pregunta: si solo está usando HQL como último recurso, entonces es probable que eso elimine el 95% de los puntos de ataque potenciales. Y, debido a que solo lo está utilizando en estos casos difíciles, es probable que esté prestando más atención a lo que realmente está haciendo.


La inyección de SQL no debe ser un riesgo cuando está usando Hibernate, siempre y cuando lo esté usando correctamente.

Las consultas de Hibernate se escriben en HQL (lenguaje de consulta similar a SQL de Hibernate) o se implementan utilizando la API de criterios orientada a objetos.

HQL es el más común y el más recomendado. Normalmente, escribirías una consulta HQL como esta:

Subscription sub = (Subscription) sessionFactory.getCurrentSession() .createQuery("from Subscription sub where sub.verification = :verification") .setString("verification", verification) .uniqueResult();

De esta forma, está protegido contra la inyección de SQL, porque Hibernate pasa la cadena como parámetro; no se puede interpretar como parte del SQL.

Sin embargo, si te portas mal, escribe una consulta como esta ...

Subscription sub = (Subscription) sessionFactory.getCurrentSession() .createQuery("from Subscription sub where sub.verification = ''" + verification + "''") .uniqueResult();

... entonces no estás protegido de la inyección de SQL. Sin embargo, nunca deberías estar escribiendo consultas como esta! No creo que ningún marco te proteja si agregas cadenas a tus consultas.

Finalmente, si utiliza la API de criterios de hibernación, estará protegido automáticamente de la inyección de SQL; Como Hibernate construye la consulta subyacente cuando está utilizando la API de criterios, lo hace de una manera que evita la inyección de SQL.