Tengo este código

UPDATE OPENQUERY (db,'SELECT * FROM table WHERE ref = ''"+ Ref +"'' AND bookno = ''"+ Session("number") +"'' ') 

¿Cómo puedo prevenir Inyecciones SQL en esto?

ACTUALIZACIÓN

Aquí es lo que estoy tratando de

SqlCommand cmd = new SqlCommand("Select * from Table where [email protected]", con); 
cmd.Parameters.AddWithValue("@ref", 34);

Por alguna razón en todo lo que me pruebe y agregue parece que no funciona sigo recibiendo SQL Command se mencionan a continuación.

El error es este

'SqlCommand' is a type and cannot be used as an expression

Estoy tomando el trabajo de alguien más, así que esto es todo nuevo para mí y me gustaría hacer las cosas de la manera correcta, asi que si alguien puede dar más ayuda sobre cómo hacer mi consulta anterior a salvo de las inyecciones de SQL, a continuación, por favor, no.

ACTUALIZACIÓN NO 2

He añadido en el código como VasilP dijo como este

Dim dbQuery As [String] = "SELECT * FROM table WHERE ref = '" & Tools.SQLSafeString(Ref) & "' AND bookno = '" & Tools.SQLSafeString(Session("number")) & "'"

Pero me da un error Tools is not declared necesito para especificar un determinado espacio de nombres para que funcione?

ACTUALIZACIÓN

Ha alguien tiene alguna idea sobre lo mejor de llegar mi consulta segura de la inyección de SQL, sin los errores que estoy experimentando?

ACTUALIZACIÓN

Ahora la tengo para que funcione sin los parámetros de bits aquí está mi actualiza el código fuente de cualquier idea de por qué no añadir el valor del parámetro?

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
   conn.Open()


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = @investor ') ", conn)
query.Parameters.AddWithValue("@investor", 69836)

dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()

Funciona así

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
   conn.Open()


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = 69836') ", conn)

dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()

El error que voy es esto

An error occurred while preparing a query for execution against OLE DB provider 'MSDASQL'. 

Y es porque no es la sustitución de la @investor con el 69836

Alguna idea?

SOLUCIÓN

Aquí es cómo he resuelto mi problema

Dim conn As SqlConnection = New SqlConnection("server='h'; user id='w'; password='w'; database='w'; pooling='false'")

conn.Open()

Dim query As New SqlCommand("DECLARE @investor varchar(10), @sql varchar(1000) Select @investor = 69836 select @sql = 'SELECT * FROM OPENQUERY(db,''SELECT * FROM table WHERE investor = ''''' + @investor + ''''''')' EXEC(@sql)", conn)

dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()

Ahora puedo escribir consultas sin la preocupación de inyección de SQL

OriginalEl autor Jamie Taylor | 2010-10-25

8 Comentarios

  1. 19

    Trate de usar un consulta parametrizada aquí hay un enlace http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/

    También, no use OpenQuery… utilice esta opción para ejecutar el select

    SELECT * FROM db...table WHERE ref = @ref AND bookno = @bookno

    Más artículos de describir algunas de sus opciones:

    http://support.microsoft.com/kb/314520

    ¿Cuál es la sintaxis T-SQL para conectarse a otro Servidor SQL?


    Editado

    Nota: Tu pregunta original estaba preguntando acerca de las consultas distribuidas y los servidores Vinculados. Esta nueva declaración no hace referencia a una consulta distribuida. Sólo puedo suponer que se conecta directamente a la base de datos ahora. Aquí está un ejemplo que debería funcionar.
    Aquí es otro sitio de referencia para el uso de SqlCommand.Parámetros

    SqlCommand cmd = new SqlCommand("Select * from Table where [email protected]", con); 
    cmd.Parameters.Add("@ref", SqlDbType.Int);
    cmd.Parameters["@ref"] = 34;

    Editado:

    Aceptar Jamie taylor voy a tratar de responder a su pregunta de nuevo.

    Está utilizando OpenQuery porque está probablemente vinculado DB

    Básicamente el problema es el OpenQuery Método recibe una cadena que no se puede pasar una variable como parte de la cadena que se envía a OpenQuery.

    Te puede dar formato a su consulta como este lugar. La notación de la siguiente manera servername.databasename.schemaname.tablename. Si está utilizando un servidor vinculado a través de odbc entonces omite databasename y schemaname, como se ilustra a continuación

        Dim conn As SqlConnection = New SqlConnection("your SQL Connection String")
        Dim cmd As SqlCommand = conn.CreateCommand()
        cmd.CommandText = "Select * db...table where investor = @investor"
        Dim parameter As SqlParameter = cmd.CreateParameter()
        parameter.DbType = SqlDbType.Int
        parameter.ParameterName = "@investor"
        parameter.Direction = ParameterDirection.Input
        parameter.Value = 34
    Me parecen errores al intentar poner esto en mi página
    Taylor …va a necesitar un poco más de detalle de lo que «parece que estoy recibiendo errores…» en el fin de ayudarle a cabo.
    Seguir recibiendo 'SqlCommand' is a type and cannot be used as an expression
    publicar el código de la pregunta original por favor
    Por favor ver mis actualizaciones con nuevos bits

    OriginalEl autor John Hartsock

  2. 5

    El uso de los parámetros en lugar de concatenar una consulta SQL.

    Asumiendo que su base de datos motor de SQL Server, he aquí un fragmento de código que espero sean de ayuda.

    Using connection As SqlConnection = new SqlConnection("connectionString")
        connection.Open()
    
        Using command As SqlCommand = connection.CreateCommand()
            string sqlStatement = "select * from table where ref = @ref and bookno = @bookno";
            command.CommandText = sqlStatement
            command.CommandType = CommandType.Text
    
            Dim refParam As SqlDataParameter = command.CreateParameter()
            refParam.Direction = ParameterDirection.Input
            refParam.Name = "@ref"
            refParam.Value = Ref
    
            Dim booknoParam As SqlDataParameter = command.CreateParameter()
            booknoParam.Direction = ParameterDirection.Input
            booknoParam.Name = "@bookno"
            booknoParam.Value = Session("number")
    
            Try
                Dim reader As SqlDataReader = command.ExecuteQuery()
                ' Do your reading job here...'
            Finally
                command.Dispose()
                connection.Dispose()
            End Try
        End Using
    End Using

    Para resumirlo todo, evitar la instrucción SQL de la concatenación de a toda costa, y el uso con parámetros quesries!

    Aquí es un interesante enlace que te lleva a través de la inyección de SQL, la resolución del problema en MSDN:

    Cómo: Proteger de la Inyección De SQL en ASP.NET

    OriginalEl autor Will Marcouiller

  3. 4

    uso sqlparameters como:

    SqlCommand cmd = new SqlCommand("Select * from Table where [email protected]", con);
    cmd.Parameters.AddWithValue("@id", 34);
    +1 Para el AddWithValue() método.
    He probado este método, pero me dio un error 'SqlCommand' is a type and cannot be used as an expression

    OriginalEl autor str

  4. 2
    SqlCommand cmd = new SqlCommand("Select * from Table where [email protected]", con); 
    cmd.Parameters.AddWithValue("@ref", 34);

    no funciona porque está escrito en C#, VB no.

    Intente algo como

    Dim cmd As New SqlCommand("Select * from Table where [email protected]", con)
    cmd.Parameters.AddWithValue("ref", 34)
    Gracias he añadido esto, pero estoy recibiendo un error diferente ahora Could not find server 'System' in sysservers. Execute sp_addlinkedserver to add the server to sysservers alguna idea de lo que esto significa?
    Usted debe comprobar que la cadena de conexión, es un error de base de datos ahora, no ASP.NET.

    OriginalEl autor Maksim Vi.

  5. 1

    Uso de LINQ. Es parametrizes consultas de forma automática.

    OriginalEl autor awrigley

  6. 1

    Retirar ORM como una alternativa (muy buena manera de ir si usted está construyendo algo de tamaño mediano o grande). Toma un poco de tiempo para configurarlo, pero entonces el desarrollo se hace MUY rápido. Elige de los nativos, Linq to SQL o Entity Framework, O bien, pruebe cualquier otro ORM que trabaja con .NET.

    OriginalEl autor AlexanderMP

Dejar respuesta

Please enter your comment!
Please enter your name here