2011-01-27 4 views
16

Odio el lenguaje Ruby porque no está tipado estáticamente, 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 Active Record previene la inyección de SQL por usted. ¿Cómo se maneja este problema normalmente con una pila de Spring/Hibernate? ¿Alguno viene con un kit de herramientas de depuración de algún tipo, para asegurarse de que la entrada de su usuario sea segura?¿Cómo se detiene típicamente la inyección SQL en una configuración de Spring/Hibernate?

Esto no es un gran problema en una inserción si solo está insertando DAO, pero es un problema importante al usar las declaraciones Select.

Respuesta

30

La inyección SQL no debería ser un riesgo cuando use Hibernate, siempre y cuando lo esté utilizando correctamente.

Las consultas de hibernación 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 más recomendado. Normalmente, usted podría escribir una consulta HQL como esto:

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

De esta forma usted está protegido de la inyección de SQL, ya que Hibernate pasa en la cadena como un parámetro; no puede ser interpretado como parte del SQL.

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

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

... entonces no está protegido de la inyección de SQL. Sin embargo, nunca deberías escribir consultas como esta. No creo que ningún framework lo proteja si agrega cadenas a sus consultas.

Finalmente, si utiliza la API de criterios de Hibernate, queda automáticamente protegido contra la inyección de SQL; Debido a que Hibernate crea la consulta subyacente cuando usa la API de Criteria, lo hace de una manera que impide la inyección de SQL.

1

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

Cuestiones relacionadas