visual net microsoft lenguaje enciclopedia edición aplicaciones sql oracle jdbctemplate

net - evitar la inyección de sql en oracle "orden por" parte



microsoft c# lenguaje y aplicaciones pdf (3)

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

Es posible que la función SIMPLE_SQL_NAME ayude a protegerse contra la inyección SQL para su cláusula ORDER BY .

Espero eso ayude...

Para obtener algunos datos estoy creando una consulta sql :)
Por supuesto que hay algunas piezas de filtrado y pedido.

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

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

Ahora, cada parámetro para clasificar se escapa manualmente al reemplazar algunos caracteres (como '') por una cadena vacía, pero algunos parámetros que configuramos para nuestro código son un poco complejos para aprobar esta regla.

¿Cuál es la mejor manera de prevenir las inyecciones de SQL en la parte ordenada de la consulta, cuando usa la plantilla jdbc?


Una forma que utilicé, aunque por razones ligeramente diferentes, fue usar Order By 3,2 (tercera columna, segunda columna)

Por lo tanto, si puede averiguar el nombre de la columna ingresado por la posición del usuario en las columnas de la salida, la indirección debe matar el vector de inyección.


Usted 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 podría elegir qué columna clasificar a través de su lugar de 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). Podría permitir que el usuario clasifique por varias columnas aceptando una lista de enteros.

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