search - injection - inyeccion sql 1=1
¿Cómo evitar la inyección de SQL en consultas SQL con Like Operator utilizando parámetros? (4)
Anwser corto:
1) name.Replace ("''", "'' ''") ... Reemplace los caracteres de escape que pueda tener su base de datos (las comillas simples son 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 la 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) use Linq a SQL, nuevamente si está usando .net
Tomando algún código de mi predecesor y encontré una consulta que utiliza el operador Like:
SELECCIONE * FROM proveedores WHERE nombre_del_proveedor 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.
Simplemente parametriza tu consulta:
SELECT * FROM suppliers WHERE supplier_name like ''%'' + @name + ''%''
Ahora puede pasar su variable "nombre" al 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.
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 las citas.
En Entity Framework 6, Native SQL lo puede hacer así:
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();