2012-01-30 7 views
16

Para obtener algunos datos estoy creando una consulta SQL :)
Por supuesto que hay algunas partes de filtrado y pedido.previene la inyección sql en Oracle "ordene por" parte

Para obtener el resultado utilizo "NamedParameterJdbcTemplate" y cuando necesito agregar algo a la parte "where", utilizo el mapa de parámetros para evitar la inyección.

Pero es diferente con la parte "ordenar por", ya que no hay escape automático (y es parte de sql). Esta parte de la orden a veces se llena con datos del usuario (directamente), a veces pone algunos parámetros de clasificación adicionales desde el código interno. Hay un problema: a veces este campo de ordenación contiene no solo el nombre de la columna, sino una declaración SQL.

Ahora cada parámetro para la clasificación se escapa manualmente reemplazando algunos caracteres (como ') por una cadena vacía, pero algunos parámetros que establecemos para nuestro código son un poco complejos para pasar esta regla.

¿Cuál es la mejor manera de evitar las inyecciones de sql en la parte de ordenar de la consulta, cuando se utiliza la plantilla jdbc?

+9

+1 para cuidar :) – RedFilter

+1

Posible usar 'PreparedStatement'? – Romain

+0

No sé sobre jdbc pero es posible usar una variable de vinculación en un 'orden por' en Oracle. – Ben

Respuesta

7

Para ayudar a proteger contra la inyección de SQL en el lado de la base de datos, echar un vistazo a la DBMS_ASSERT incorporado en el paquete de Oracle: http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm

Es posible encontrar la función SIMPLE_SQL_NAME ayudará a proteger contra la inyección de SQL para su cláusula ORDER BY.

creo que sirve ...

+0

Eso es probablemente mejor que usar la función de escape personalizada. Si no habrá forma de hacerlo con alguna biblioteca (jdbctemplate o algo similar), probablemente lo haga. – Dainius

1

Una forma en que utiliza, aunque por razones ligeramente diferentes era utilizar Ordenar por 3,2 (tercera columna, segunda columna)

Así que si usted puede averiguar el nombre de columna introducida por el usuario en posición de columnas de la salida, indirección debería matar el vector de inyección.

+0

problema que a veces este campo de clasificación contiene no solo el nombre de la columna, sino una declaración sql – Dainius

+0

¿Un usuario ingresó la instrucción sql? –

+0

No es que directamente, algunos enlaces tienen un parámetro que se pasa a la parte "ordenar por". Lo primero que se debe resolver es crear un mapa de los campos de clasificación permitidos y obtener ese campo por parámetro para url, como una clave, algo similar (o lo mismo) que Vincent ha sugerido. Pero también hay algún código antiguo, que no me gustaría modificar (que sabe cuánto tiempo durará), y hay algunos SQL. Y podría haber algún otro lugar donde se use este parámetro de orden. – Dainius

2

Se podría limitar la elección del orden de clasificación. La mayoría de las aplicaciones solo permiten a los usuarios ordenar por una columna mostrada, el usuario puede elegir qué columna ordenar a través de su columna.

En este caso, solo aceptaría un número entero del usuario (podría aceptar un número negativo para ordenar por orden descendente). Puede permitir que el usuario ordene por varias columnas al aceptar una lista de enteros.

Los enteros son fáciles de verificar y esto no expone los nombres de las columnas subyacentes al usuario.

Cuestiones relacionadas