Para una aplicación que estoy planificando, tengo el requisito de que la entrada proviene de aproximadamente 30 a 50 tablas de origen del servidor SQL y debe insertarse en una tabla de destino. Las tablas de origen tienen una estructura ligeramente diferente, pero al final, cada registro de destino provendrá de exactamente un registro de una de las tablas de origen. Debe haber una posibilidad para que los usuarios especifiquen para cada tabla de origen y cada columna de destino una expresión como e. sol. case when col1 like 'a%' then 'ABC' else Left(col5 + col6, 10) end
o simplemente 'xxx'
o col4
.
Una forma fácil de implementar esto sería simplemente compilar una cláusula de selección dinámica de SQL en una tabla de origen a partir de la lista de estas expresiones y, por lo tanto, dejar que el motor SQL haga la interpretación de la expresión. Esto sería bastante flexible, ya que más o menos cada expresión SQL válida estaría disponible para los usuarios. Una implementación más complicada sería definir un conjunto de expresiones que admita la aplicación y crear un analizador de expresiones, que interpretaría todas las expresiones y las mostraría en la cláusula select
, y por lo tanto tendría el control total de SQL generado. Pero tendríamos que anticipar el conjunto de expresiones requerido.
Por supuesto, si se implementa ingenuamente, el primer enfoque ofrecería el potencial de inyección SQL. Pero si quisiera crear un ID de usuario por tabla de origen que no tenga permiso, excepto seleccionar en esta tabla y ejecutar el SQL dinámico con ese ID de usuario, no veo ningún potencial para una inyección de SQL exitosa. E incluso los mensajes de error no deberían revelar nada útil para un atacante, ya que las estructuras de las tablas de origen y destino serían conocidas por los usuarios de todos modos. Cualquier ataque útil que intente cambiar cualquier cosa en la base de datos no sería posible debido a los permisos limitados.
¿Existe algún potencial de inyección SQL con este enfoque que no haya visto?