Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: novalida en 3 Julio 2012, 18:31 pm



Título: Diferencia entre manera de programar
Publicado por: novalida en 3 Julio 2012, 18:31 pm
Hola!!!

He estado viendo varios tutoriales para trabajar con bases de datos en .NET y he encontrado dos maneras de escribir código que no sé muy bien por qué una dicen que es mejor que la otra.

Aquí os presentos ambas versiones con la parte de código que corresponde a lo que no entiendo en Visual Basic .NET. Es sólo el código con el que se conseguiría lo mismo, dado que únicamente faltaría en cada caso la ejecución contra la base de datos.

La primera versión:

Código:
Dim comando As String
Dim comandoSQL as SqlCommand

comando = "SELECT campo FROM tabla WHERE fila = " & valor

comandoSQL.CommandType = CommandType.Text
comandoSQL.Command.Text = comando


La segunda versión:

Código:
Dim comando As String
Dim comandoSQL as SqlCommand

comando = "SELECT campo FROM tabla WHERE fila = @param"

comandoSQL.CommandType = CommandType.Text
comandoSQL.Command.Text = comando

Dim parametro as New SqlParameter ("param", valor)

param.DbType = DbType.Integer
comandoSQL.Parameters.Add(param)


Entiendo cada una de las líneas de ambos códigos, pero no entiendo por qué dicen que es mejor la segunda versión que la primera, si la primera implica menos código.

Si alguien me pudiera echar un poquito de luz y aclararme el tema se lo agradecería :)


Gracias y un saludo!!!!


Título: Re: Diferencia entre manera de programar
Publicado por: cristiantorres en 3 Julio 2012, 19:00 pm
Pues siempre es mejor usar parámetros, ya que en cierta medida es mas seguro usar parámetros y no directamente los valores


Título: Re: Diferencia entre manera de programar
Publicado por: Novlucker en 3 Julio 2012, 19:02 pm
Seguridad.

En el primer caso se podría concatenar cualquier consulta (SQL injection)
En el segundo caso estás utilizando una consulta parametrizada, con lo cual te aseguras que el valor que esperas sea el correcto.

Saludos


Título: Re: Diferencia entre manera de programar
Publicado por: novalida en 3 Julio 2012, 19:22 pm
Es cierto!!!

No había pensado en ello pero ahora me surje otra duda.

Si la aplicación que se desarrolla no es web si no de escritorio, ¿también se debería hacer de la segunda manera?


Título: Re: Diferencia entre manera de programar
Publicado por: Novlucker en 3 Julio 2012, 19:30 pm
Si, es indiferente.

Saludos


Título: Re: Diferencia entre manera de programar
Publicado por: HdM en 3 Julio 2012, 19:31 pm
Buenas.

Las app de escritorio también son susceptibles a SQLi. De todos modos si se utiliza la 1ª opción que has planteado y lo que introduce el usuario se filtra/procesa y se "limpia" antes de pasarlo a la query, no debería haber problema.

Saludos.


Título: Re: Diferencia entre manera de programar
Publicado por: novalida en 3 Julio 2012, 19:48 pm
Ahora ya tengo algo más de idea sobre el trabajo de aplicaciones contra bases de datos.

Muchas gracias!!!


Título: Re: Diferencia entre manera de programar
Publicado por: MaLkAvIaN_NeT en 3 Julio 2012, 22:55 pm
Las dos opciones que pones trabajan en una sola capa

Código:
comando = "SELECT campo FROM tabla WHERE fila = " & valor

Código:
comando = "SELECT campo FROM tabla WHERE fila = @param"

es decir son sentencias que se vuelven a validar en el motor de base de datos buscando que no haya problemas de sintaxis en las consultas que se mandan como texto plano, lo  que no pasaría si trabajaras a dos capas, es decir usando los store procedures los que ya no tienen que validarse si no simplemente se ejecutan porque son estructuras de código ya definidas en la base de datos.

en el siguiente ejemplo le mandas parámetros a un store procedure que previamente tienes que tener creado en tu base de datos

Código:
    Public Function mantenimiento(ByVal cnn As SqlClient.SqlConnection, ByVal tipo As tipo_mantenimiento) As Integer
        Dim comando As New SqlClient.SqlCommand, parametro As New SqlClient.SqlParameter
        comando.Connection = cnn

        If tipo = tipo_mantenimiento.insertar Then
            comando.CommandText = "[sp_SIAF_EXPEDIENTE_Insertar]"
        End If

        comando.CommandType = CommandType.StoredProcedure

        parametro = comando.Parameters.Add("@ano_eje", SqlDbType.Char, 4)
        parametro.Value = Me.ano_eje
        parametro = comando.Parameters.Add("@expediente", SqlDbType.Char, 10)
        parametro.Value = Me.expediente
        parametro = comando.Parameters.Add("@tipo_operacion", SqlDbType.Char, 2)
        parametro.Value = Me.tipo_operacion
        parametro = comando.Parameters.Add("@modalidad_compra", SqlDbType.Char, 2)
        parametro.Value = Me.modalidad_compra
        parametro = comando.Parameters.Add("@sec_ejec", SqlDbType.Char, 6)
        parametro.Value = Me.sec_ejec

        return comando.ExecuteScalar()

    End Function