elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Diferencia entre manera de programar
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Diferencia entre manera de programar  (Leído 2,620 veces)
novalida

Desconectado Desconectado

Mensajes: 155


Ver Perfil
Diferencia entre manera de programar
« 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!!!!


En línea

cristiantorres

Desconectado Desconectado

Mensajes: 35

Bendiciones Para Todos


Ver Perfil WWW
Re: Diferencia entre manera de programar
« Respuesta #1 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


En línea

Visita mi Blog C#, Asp.Net, Python y mas...
http://cristiantorresalfaro.blogspot.com
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Diferencia entre manera de programar
« Respuesta #2 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
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
novalida

Desconectado Desconectado

Mensajes: 155


Ver Perfil
Re: Diferencia entre manera de programar
« Respuesta #3 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?
En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Diferencia entre manera de programar
« Respuesta #4 en: 3 Julio 2012, 19:30 pm »

Si, es indiferente.

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
HdM


Desconectado Desconectado

Mensajes: 1.674



Ver Perfil
Re: Diferencia entre manera de programar
« Respuesta #5 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.
En línea

- Nice to see you again -
novalida

Desconectado Desconectado

Mensajes: 155


Ver Perfil
Re: Diferencia entre manera de programar
« Respuesta #6 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!!!
En línea

MaLkAvIaN_NeT

Desconectado Desconectado

Mensajes: 213


MaLkAvIaN_NeT


Ver Perfil WWW
Re: Diferencia entre manera de programar
« Respuesta #7 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
En línea

a por las buenas ideas
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines