2008-10-23 14 views
13
selefime bazı kod devralan

ve ben gibi operatörünü kullanan bir sorgu bulundu: tedarikçi supplier_name '%' + isim +% 'gibi GELENSQL sorgusunda SQL Sorgulama gibi parametreler kullanarak Like Operator ile kaçının mı?

SELECT *;

SQL Injection sorununu engellemeye çalışıyorum ve bunu parametreleştirmeye çalışıyorum ancak bunun nasıl gerçekleştirileceğinden emin değilim. Baska öneri ?

not, klasik ADO.NET için bir çözüme ihtiyacım var - Bu kodu LINQ gibi bir şeye çevirmeye gerçekten gerek yok.

cevap

17

.net

kullanıyorsanız yine eğer

3) kullanıcı Saklanan procs ) bu deneyin, SQL Linq to kullanın.

Varlık Çerçeve 6'da
+0

Teşekkürler! Çalışma kodu snippet'ini cevap olarak almak güzel. Sorgu metninde {0} tarihinde takılıyordum. – MikeJ

8

Basitçe sorgu parametreleştirdiğinizde:

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

Şimdi @name parametresi içine "adı" değişken geçirebilirsiniz ve sorgu enjeksiyon saldırıları herhangi bir tehlike olmaksızın çalıştırır. "'' VEYA true - gibi bir şeyi iletseniz bile, yine de iyi çalışır.

-5

Kısa anwser:

1) name.Replace ("'", " ''") ....

) en yaygın olan herhangi bir kaçış veritabanı olabilir karakterler (tek tırnak değiştirin

Eğer .net

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

Parametreli Sorgu kullanmak gibi bir dil kullanıyorsanız 2) yukarıdaki

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 
altında değiştirilir alır

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

çerçeve otomatik alıntı sorunları çözecek bir: Eğer

+0

Buradaki tüm oyların nedenini göremiyorum ... Seçenek yelpazesini ve kullanılabilir olanı gösterdim. Şahsen ben seçenek 1 kullanmazdım, ama tüm karakterlerin sadece tek tırnaklardan kaçması gerekeceğini söyledim. Bu yapılırsa, bu tamamen geçerli. Seçenekler sadece oradan daha iyi olsun. İnsanlar nedenini söylemeden oy kullanmamalıdırlar. – vdhant

+0

vdhant, soruya cevap vermediniz. İlk soru Like operatörü ile parametreli sorguların nasıl kullanılacağı üzerine odaklanmıştı ve cevabınızda Like operatöründen hiç bahsetmiyorsunuz. – CodeThug

0

Native SQL tarafından böyle yapılabilir:

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

Ya da

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

, sadece doğrudan LıNQ varlıkları kullanabilirsiniz:

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