2008-10-23 21 views
13

Tomando más de un código de mi predecesor y me encontré con una consulta que utiliza el operador Like:¿Cómo evitar la inyección SQL en una consulta SQL con el operador Like utilizando los parámetros?

SELECT * FROM proveedores DONDE supplier_name como '%' + nombre +% ';

Tratando de evitar el problema de SQL Injection y parametrizar esto, pero no estoy muy seguro de cómo se lograría esto. Alguna sugerencia ?

nota, necesito una solución para ADO.NET clásico - Realmente no tengo el visto bueno para cambiar este código a algo como LINQ.

Respuesta

17

intente esto:

var query = "select * from foo where name like @searchterm"; 
using (var command = new SqlCommand(query, connection)) 
{ 
    command.Parameters.AddWithValue("@searchterm", String.Format("%{0}%", searchTerm)); 
    var result = command.ExecuteReader(); 
} 

el marco tratará de forma automática con las cuestiones de cotización.

+0

¡Gracias! Es bueno tener un fragmento de código de trabajo como respuesta. Me estaba quedando atrapado en el {0} en el texto de la consulta. – MikeJ

8

Simplemente parametrizar su consulta:

SELECT * FROM suppliers WHERE supplier_name like '%' + @name + '%' 

Ahora usted puede pasar su "nombre" variable en el parámetro @ name y la consulta se ejecutará sin ningún peligro de ataques de inyección. Incluso si transmite algo como "'' O verdadero -" todavía funcionará bien.

-5

Anwser corta:

1) name.Replace ("'" " ''") .... Reemplace los caracteres de escape que su base de datos puede tener (comillas simples, siendo el más común)

2) si está utilizando un lenguaje como .NET utilizan consultas parametrizadas

sql="Insert into Employees (Firstname, Lastname, City, State, Zip, Phone, Email) Values ('" & frmFirstname.text & "', '" & frmLastName & "', '" & frmCity & "', '" & frmState & "', '" & frmZip & "', '" & frmPhone & "', '" & frmEmail & "')" 

lo anterior se reemplaza con el siguiente

Dim MySQL as string = "Insert into NewEmp (fname, LName, Address, City, State, Postalcode, Phone, Email) Values (@Firstname, @LastName, @Address, @City, @State, @Postalcode, @Phone, @Email)" 

With cmd.Parameters: 
    .Add(New SQLParameter("@Firstname", frmFname.text)) 
    .Add(New SQLParameter("@LastName", frmLname.text)) 
    .Add(New SQLParameter("@Address", frmAddress.text)) 
    .Add(New SQLParameter("@City", frmCity.text)) 
    .Add(New SQLParameter("@state", frmState.text)) 
    .Add(New SQLParameter("@Postalcode", frmPostalCode.Text)) 
    .Add(New SQLParameter("@Phone", frmPhone.text)) 
    .Add(New SQLParameter("@email", frmemail.text)) 
end with 

3) almacenados por el usuario procsos

4) el uso de LINQ to SQL, de nuevo si está utilizando .NET

+0

No veo por qué todos los votos hacia abajo aquí ... Mostré el rango de opciones y lo que estaba disponible. Personalmente, no usaría la opción 1, pero he dicho que todos los personajes deberían escaparse, no solo las comillas simples. Si está hecho eso es perfectamente válido. Las opciones solo mejoran desde allí. La gente no debería votar sin decir por qué. – vdhant

+0

vdhant, no respondió la pregunta. La pregunta inicial se centró en cómo usar consultas parametrizadas con el operador Like, y no menciona el operador Like en absoluto en su respuesta. – CodeThug

0

En Entity Framework 6 se podría hacer como esto por SQL Nativo:

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person] 
     WHERE [FirstName] LIKE N'%' + @p0 + '%' ", "ab").ToList(); 

O

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person] 
     WHERE [FirstName] LIKE N'%' + @name + '%' ", 
    new SqlParameter("@name", "ab")).ToList(); 

Además, sólo puede utilizar LINQ a Entidades directamente:

List<Person> peopleList1 = contex.People.Where(s => s.FirstName.Contains("ab")).ToList(); 
Cuestiones relacionadas