none
Como sustituir nombre de una tabla por una variable RRS feed

  • Pregunta

  • Buenas.

    Quiero Sustituir el nombre de la tabla por una variable.

    SqlCommand sql = new SqlCommand("SELECT * FROM '"+Lcur.Text+"' ", connection);       

    Lo intento hacer asi pero me dice Error de Sintaxis cerca 'Valor del Lcur.Text'.

    domingo, 30 de diciembre de 2018 6:19

Respuestas

  • Hola:

    Si bien lo que dice Alberto es del todo correcto, como no puede ser de otro modo, yo sigo teniendo un punto de vista un pelín diferente en este aspecto. Parametrizar no le hace daño a nadie, no es una mala "práctica", y elimina problemas.

    Por tanto el primer paso es "SANEAR"

    Y en el servidor, además le puedo dar un plus simple de seguridad variando un pelín el procedure.

    ALTER PROCEDURE sp_Listado (@nombre varchar(100))
    as
    declare @sentencia as NVARCHAR(4000);
    set @sentencia= 'select * from '+ 
    	case @nombre 
    		when 'Tabla_Alumnos' then @nombre
    		when 'Tabla_Cursos' then @nombre
    		else '( Select ''TablaNoExiste'' ) O (COLUMNA)'
    	end 
    
    exec sp_executesql @SENTENCIA
    RETURN
    

    O inculso algo donde tenga que trabajar menos.

    ALTER PROCEDURE sp_Listado (@nombre nvarchar(100))
    as
    declare @sentencia as NVARCHAR(4000);
    
    set @sentencia= 'select * from '+ 
    	case when (select count(*) from sys.tables t where t.name = @nombre)=1 then @nombre
    		else '( Select ''TablaNoExiste'' ) O (COLUMNA)'
    	end 
    
    exec sp_executesql @SENTENCIA
    RETURN
    
    

    Pero siempre teniendo bien claro, que esto es poner en riesgo parte de la seguridad de la base de datos, por quiza hacerlo de un modo simple.

    Sql Injection

    http://www.mclibre.org/consultar/php/lecciones/php-db-inyeccion-sql.html

    https://www.comunixgroup.com/ataques-sql-injection/

    domingo, 30 de diciembre de 2018 21:19

Todas las respuestas

  • Hola Harold Rodado:

    En VB.NET, deberías de sustituir ese más por &

    Pero nunca deberías de permitir pasar directemente a una consulta lo que tiene un textbox, donde el usuario pueda introducir datos, ya que puedes tener un ataque de injeccion SQL.

    Deberías de utilizar parametros en tu consulta.

    Y luego puedes para cerrar un poco el círculo, en vez de implementar directamente la consulta, en codigo, generar un procedimiento almacenado que ejecute una consulta dinámica sobre lo que le has pasado como parametro.

    create procedure sp_Listado (@nombre varchar(100))
    as
    declare @sentencia as NVARCHAR(4000) = 'select * from ' + @NOMBRE;
    
    exec sp_executesql @SENTENCIA
    RETURN

    Solo te resta pasarle como parametros al sp_Listado el nombre de la tabla que quieres que te retorne.

    Llamar sp en vb con parametros

    https://stackoverflow.com/questions/10373301/sql-server-stored-procedure-and-execute-in-vb-net

    Consultas dinámicas:

    https://docs.microsoft.com/es-es/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017


    • Propuesto como respuesta Sergio Parra lunes, 31 de diciembre de 2018 0:13
    domingo, 30 de diciembre de 2018 8:44
  • Aquí tengo que discrepar de lo que dice Javi, en cuanto a lo de "deberías de utilizar parametros en tu consulta". Con carácter general eso es cierto, las sentencias SQL se deben parametrizar. Pero en este caso particular, no sirve para nada parametrizarla, dado que precisamente lo que estás cambiando es el nombre de la tabla, que no puede ser parametrizado. Eso obliga a tomar el parámetro y concatenarlo en la sentencia en el lado SQL, y luego llamar al sp_executesql, como ha hecho Javi en su ejemplo. Con eso no ganas nada. Los riesgos e inificiencias continúan siendo los mismos si concatenas el nombre de tabla para un sp_execuesql que si lo concatenas en lado cliente. No tiene ninguna ventaja hacer la concatenación en el lado servidor, continúa sufriendo los mismos riesgos. La única solución es "sanear" el valor tecleado (comprobando que es válido y metiéndole los pertinentes "escapes" si es necesario) antes de concatenarlo en la sentencia
    domingo, 30 de diciembre de 2018 14:22
  • Hola:

    Si bien lo que dice Alberto es del todo correcto, como no puede ser de otro modo, yo sigo teniendo un punto de vista un pelín diferente en este aspecto. Parametrizar no le hace daño a nadie, no es una mala "práctica", y elimina problemas.

    Por tanto el primer paso es "SANEAR"

    Y en el servidor, además le puedo dar un plus simple de seguridad variando un pelín el procedure.

    ALTER PROCEDURE sp_Listado (@nombre varchar(100))
    as
    declare @sentencia as NVARCHAR(4000);
    set @sentencia= 'select * from '+ 
    	case @nombre 
    		when 'Tabla_Alumnos' then @nombre
    		when 'Tabla_Cursos' then @nombre
    		else '( Select ''TablaNoExiste'' ) O (COLUMNA)'
    	end 
    
    exec sp_executesql @SENTENCIA
    RETURN
    

    O inculso algo donde tenga que trabajar menos.

    ALTER PROCEDURE sp_Listado (@nombre nvarchar(100))
    as
    declare @sentencia as NVARCHAR(4000);
    
    set @sentencia= 'select * from '+ 
    	case when (select count(*) from sys.tables t where t.name = @nombre)=1 then @nombre
    		else '( Select ''TablaNoExiste'' ) O (COLUMNA)'
    	end 
    
    exec sp_executesql @SENTENCIA
    RETURN
    
    

    Pero siempre teniendo bien claro, que esto es poner en riesgo parte de la seguridad de la base de datos, por quiza hacerlo de un modo simple.

    Sql Injection

    http://www.mclibre.org/consultar/php/lecciones/php-db-inyeccion-sql.html

    https://www.comunixgroup.com/ataques-sql-injection/

    domingo, 30 de diciembre de 2018 21:19