¿Evitar la inyección SQL en una consulta SQL con un operador similar utilizando parámetros?

StackOverflow https://stackoverflow.com/questions/228476

Pregunta

Tomando el control de un código de mi predecesor y encontré una consulta que usa el operador Me gusta:

SELECCIONAR * DE los proveedores DONDE supplier_name como '%' + nombre +% ';

Intentando evitar el problema de la inyección de SQL y parametrizar esto, pero no estoy muy seguro de cómo se lograría esto. ¿Alguna sugerencia?

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

¿Fue útil?

Solución

prueba 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á automáticamente los problemas de cotización.

Otros consejos

Simplemente parametrice su consulta:

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

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

En Entity Framework 6 se podría hacer así mediante 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, puedes usar LINQ para entidades directamente:

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

Anwser corto:

1) name.Replace (" '" ;, "' '") .... Reemplaza los caracteres de escape que pueda tener tu base de datos (siendo las comillas simples las más comunes)

2) si está utilizando un lenguaje como .net use 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 lo 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) Procs almacenados por el usuario

4) usa Linq para SQL, de nuevo si estás usando .net

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top