2008-10-23 37 views
13

Tiếp quản một số mã từ người tiền nhiệm của tôi và tôi đã tìm thấy truy vấn sử dụng toán tử Thích:Tránh SQL Injection trong truy vấn SQL với Like Operator bằng cách sử dụng các tham số?

CHỌN * TỪ nhà cung cấp WHERE provider_name like '%' + name +% ';

Cố gắng tránh vấn đề SQL Injection và tham số hóa nhưng tôi không hoàn toàn chắc chắn cách thực hiện điều này. Bất kỳ đề xuất ?

lưu ý, tôi cần một giải pháp cho ADO.NET cổ điển - Tôi không thực sự có đi trước để chuyển mã này sang một cái gì đó như LINQ.

Trả lời

17

thử điều này:

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

khuôn khổ sẽ tự động đối phó với các vấn đề trích dẫn.

+0

Cảm ơn! Rất vui khi nhận được đoạn mã hoạt động như một câu trả lời. Tôi đã bị kẹt trên {0} trong văn bản truy vấn. – MikeJ

8

Đơn giản chỉ cần parameterize truy vấn của bạn:

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

Bây giờ bạn có thể vượt qua "cái tên" biến của bạn vào tham số @name và truy vấn sẽ thực hiện mà không cần bất kỳ nguy cơ tấn công tiêm. Ngay cả khi bạn chuyển vào một cái gì đó như "'' HOẶC đúng -" nó vẫn sẽ hoạt động tốt.

-5

anwser viết tắt:

1) name.Replace ("'", " ''") .... Thay thế bất kỳ ký tự thoát mà cơ sở dữ liệu của bạn có thể có (dấu nháy đơn là phổ biến nhất)

2) nếu bạn đang sử dụng một ngôn ngữ như .net sử dụng tham số truy vấn

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

trên đây được thay thế bằng bên dưới

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) người sử dụng lưu trữ procs

4) sử dụng LINQ to SQL, một lần nữa nếu bạn đang sử dụng .net

+0

Tôi không thấy lý do tại sao tất cả các phiếu bầu ở đây ... Tôi đã cho thấy nhiều tùy chọn và những gì đã sẵn sàng. Cá nhân tôi sẽ không sử dụng tùy chọn 1, nhưng tôi đã nói rằng tất cả các nhân vật sẽ cần phải được thoát khỏi không chỉ là dấu nháy đơn. Nếu thực hiện điều đó là hoàn toàn hợp lệ. Các tùy chọn chỉ nhận được tốt hơn từ đó. Mọi người không nên bỏ phiếu mà không nói lý do tại sao. – vdhant

+0

vdhant, bạn không trả lời câu hỏi. Câu hỏi ban đầu tập trung vào cách sử dụng các truy vấn được tham số hóa với toán tử Like và bạn không đề cập đến toán tử Like ở tất cả trong câu trả lời của bạn. – CodeThug

0

Trong Entity Framework 6 nó có thể được thực hiện như thế này bởi SQL Native:

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

Hoặc

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

Ngoài ra, bạn chỉ có thể sử dụng LINQ to Entities trực tiếp:

List<Person> peopleList1 = contex.People.Where(s => s.FirstName.Contains("ab")).ToList(); 
Các vấn đề liên quan