2008-10-23 3 views
13

Die Übernahme von einigem Code von meinem Vorgänger und ich fand eine Abfrage, die den Like-Operator verwendet:Vermeidung von SQL Injection in SQL-Abfrage mit Like Operator mit Parametern?

SELECT * FROM Lieferanten WHERE SUPPLIER_NAME like '%' + name +% ';

Versuchen, SQL Injection Problem zu vermeiden und dieses zu parametrisieren, aber ich bin nicht ganz sicher, wie dies erreicht werden würde. Irgendwelche Vorschläge ?

Hinweis, ich brauche eine Lösung für klassische ADO.NET - Ich habe nicht wirklich den Start, um diesen Code zu etwas wie LINQ zu wechseln.

Antwort

17

versuchen Sie dies:

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(); 
} 

der Rahmen automatisch mit den unter Angabe Fragen beschäftigen.

+0

Danke! Schön, funktionierendes Code-Snippet als Antwort zu bekommen. Ich bin im Abfragetext an der {0} hängengeblieben. – MikeJ

8

parametrieren einfach Ihre Anfrage:

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

Jetzt können Sie Ihre „name“ Variable in die @name Parameter übergeben und die Abfrage, ohne Gefahr von Injection-Angriffe ausführt. Selbst wenn Sie etwas wie '' 'ODER' 'wahr' 'eingeben, wird es immer noch gut funktionieren.

-5

Kurz anwser:

1) name.Replace ("'", " ''") .... Ersetzen Sie alle Escape-Zeichen, die Ihre Datenbank haben können (einfache Anführungszeichen sind die am häufigsten)

2) wenn Sie eine Sprache verwenden, wie .net parametrisierte Abfragen

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

die oben wird mit der

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 
unter

verwenden ersetzt

3) Benutzer Stored Procs

4) verwenden Linq to SQL, wieder, wenn Sie .net verwenden

+0

Ich sehe nicht, warum alle Down-Stimmen hier ... ich zeigte die Bandbreite der Möglichkeiten und was zur Verfügung stand. Persönlich würde ich Option 1 nicht verwenden, aber ich habe gesagt, dass alle Zeichen maskiert werden müssen, nicht nur die einfachen Anführungszeichen. Wenn das erledigt ist, ist das absolut gültig. Die Optionen werden nur von dort besser. Die Leute sollten nicht abstimmen, ohne zu sagen, warum. – vdhant

+0

vdhant, du hast die Frage nicht beantwortet. Die erste Frage konzentrierte sich auf die Verwendung von parametrisierten Abfragen mit dem Operator "Gefällt mir" und Sie erwähnen den Operator "Wie" in Ihrer Antwort überhaupt nicht. – CodeThug

0

In Entity 6 Rahmen es wie folgt von Native SQL getan werden könnte:

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

Oder

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

Sie können aber auch nur LINQ verwenden, um direkt zu Instanzen:

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