2008-10-23 22 views
13

Przejęcie niektórych kodu z mojego poprzednika i znalazłem kwerendę, która używa Podoba operatora:Unikanie iniekcji SQL w zapytaniu SQL z podobnym operatorem przy użyciu parametrów?

SELECT * FROM dostawców GDZIE supplier_name jak „%” + nazwa +% ';

Próbuję uniknąć problemu z iniekcją SQL i sparametryzować to, ale nie jestem do końca pewien, jak by to się udało. Jakieś sugestie ?

Uwaga, potrzebuję rozwiązania dla klasycznego ADO.NET - nie mam zbyt wiele, aby przełączyć ten kod na coś podobnego do LINQ.

Odpowiedz

17

spróbuj tego:

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

ramy automatycznie radzić sobie z problemami cytowania.

+0

Dzięki! Miło, że jako odpowiedzi można użyć działającego fragmentu kodu. Utknąłem na {0} w tekście zapytania. – MikeJ

8

Wystarczy parametryzacji zapytanie:

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

Teraz można zdać „nazwa” zmiennej do parametru @name a zapytanie zostanie wykonane bez zagrożenia atakami iniekcji. Nawet jeśli przekażesz coś w stylu "" "LUB" prawda ", nadal będzie działało dobrze.

-5

Krótki anwser:

1) name.Replace (""" " ''") .... Wymienić żadnych znaków ewakuacyjnych, że baza danych może mieć (apostrofów będące najczęstszym)

2) jeśli używasz języka jak .net używania sparametryzowanych kwerend

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

powyższy zostaje zastąpiony poniżej

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) przechowywanych przez użytkownika procuje

4) używać LINQ to SQL, ponownie, jeśli używasz .NET

+0

Nie rozumiem, dlaczego wszystkie głosy w dół tutaj ... Pokazałem zakres opcji i co było dostępne. Osobiście nie użyłbym opcji 1, ale powiedziałem, że wszystkie postacie będą musiały być unikane, a nie tylko pojedyncze cytaty. Jeśli to zrobisz, jest to całkowicie poprawne. Opcje tylko lepiej z tego pochodzą. Ludzie nie powinni głosować bez powiedzenia, dlaczego. – vdhant

+0

vdhant, nie odpowiedziałeś na pytanie. Początkowe pytanie skupiało się na tym, jak używać sparametryzowanych zapytań z operatorem Like, a nie wspominasz w ogóle o operatorze Like w twojej odpowiedzi. – CodeThug

0

W Entity Framework 6 można to zrobić w ten sposób przez Native SQL:

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

Albo

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

Ponadto, można po prostu użyć LINQ do podmiotów bezpośrednio:

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