2012-04-12 14 views
5

Para evitar inyecciones SQL, normalmente parámetros posicionales y parámetros con nombre se pueden utilizar en HQL ya que Demos here y stackoverflow también tiene muestras. Quiero saber qué pasos se pueden tomar cuando se usa Criteria.Cualquier ayuda con ejemplos de códigos o enlaces útiles, por favor.SQL inyección a través de Hibernate-Criterios y Session.save (objeto)

Editar
También cuando guardamos un objeto, ¿entonces? digamos, el objeto puede tener una variable String y alguien puede asignarle una consulta sql vulnerable.

myObject.setName(somevulnerablesql); session.save(myObject); 

En ese caso, ¿deberíamos tener que verificar la entrada del usuario por separado antes de asignarle el objeto? o cualquier otro paso para evitar tales inyecciones sql?

Respuesta

4

Estoy seguro de que el Criteria-Object creará una HSQL segura.

Tiene que tener cuidado con el objeto Expression. Puede crear una inyección SQL allí. Pero echar un vistazo al SQL generado: Hibernate show real SQL

edición: A menos que haya un gran error en hibernación, que no tienen que asegurarse de que sus String s se escaparon antes de guardarlos. Hibernate funciona con declaraciones preparadas. Por lo tanto, no hay concatenación de cadenas ni inyección de SQL con la sesión de Hibernate.

Es probable que tenga que escapar de la salida después de leerlo con Hibernate. Por ejemplo: tiene un usuario Entidad

class User{ 
    String name; 
} 

Y se llama al usuario "' o 1 = 1, el usuario DROP DATABASE; -" Esa cadena se almacena dentro de la base de datos. Si consulta al Usuario con un objeto Criterion, lo encontrará (sin dejar caer el databse). Si consulta al Usuario con el objeto Expresión, puede soltar la base de datos (si concede Cadenas).

Si envía el nombre del usuario a HTML, debe escapar de la salida. De lo contrario, un usuario con un nombre "/><script>evilJavascript()</script> será malo para su aplicación.

editar 2: echar un vistazo aquí: https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

+0

Gracias. ¡De hecho, mi siguiente pregunta fue esa! He editado mi pregunta. –

3

Los criterios no le permiten escribir SQL/HQL vulnerable por lo que no debería haber ningún problema con la inyección SQL (a menos que haya un error en Hibernate).

Edición:

Como @ckuetbach señaló, Criterios de hecho le permite escribir SQL mediante Expression.sql(String sql) o Restrictions.sqlRestriction(String).

+1

Eso no completar correcta pienso: http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/criterion/ Expression.html –

+0

@ ckuetbach.Gracias. ¿Podrías explicar más por favor con algún fragmento de código? –

+0

@ckuetbach estuvo de acuerdo, no estaba al tanto de eso. Actualizaré mi respuesta. – Thomas

Cuestiones relacionadas