2011-05-11 52 views
5

Tôi hiện đang thực hiện một dự án với C# và LINQ-TO-SQL. Dự án này có an ninh như là một ưu tiên cao, vì vậy rõ ràng là tôi muốn ngăn chặn SQL-Tiêm. Tôi googled về vấn đề này, nhưng nó không bật lên bất cứ điều gì hữu ích. Câu hỏi thường gặp của Microsoft nói với tôi rằng Tiêm sẽ không có vấn đề gì, vì cách LINQ xử lý các tham số, tuy nhiên thấy mã LINQ tạo ra trong trình gỡ lỗi và đọc một chút về cách LINQ-To-SQL xây dựng lên SQL Tôi không chắc chắn điều này áp dụng như thế nào.LINQ-To-SQL ngăn chặn SQL-Injection như thế nào?

Có ai có bất kỳ tài liệu/liên kết nào đề cập đến vấn đề này không?

Trả lời

6

LINQ to SQL tự động sử dụng SQLParameters. Đầu vào của người dùng được chuyển thành các giá trị tham số thay vì chỉ đơn giản là một chuỗi được nối (đó là những gì cho phép tiêm SQL). Điều này xảy ra serverside, IIRC, vì vậy bạn có thể chỉ nhìn thấy mã phía máy khách. Nếu bạn muốn có thêm một chút thông tin cơ bản, bạn có thể đọc the information here.

+0

Được rồi, Trang 2 của bài viết đã xóa câu hỏi của tôi. Cảm ơn bạn vì câu trả lời! – fk2

6

Nó khá đơn giản, thực sự - bản dịch không bao giờ tiêm biến mà không tham số hóa chúng; vậy:

var orders = from ord in ctx.Orders 
      where ord.CustomerName = name 
      select ord; 

sẽ trở thành:

SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @p0 

nơi p0 là một tham số có giá trị lấy từ bạn bắt name

gì hơn, không kém. Nhưng điều này tránh các cuộc tấn công tiêm. Ngược lại với một sai tình cờ:

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = '" + name + "'"; 

trong đó giới thiệu những rủi ro rất lớn. Bạn có thể dĩ nhiên parameterise ở trên một cách chính xác, quá:

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @name"; 

(và thêm một tham số @name với giá trị từ name)

+0

Làm thế nào? Hãy nói rằng tôi có một lĩnh vực đầu vào có chứa một String. Ai đó vào "Drop Database" hoặc một cái gì đó tương tự. Điều này đánh giá thành 'SELECT * FROM [Orders] WHERE [CustomerId] =; Drop Database'. Tôi không có vấn đề gì à? – fk2

+0

@ fk2, tôi không nghĩ rằng bạn hiểu được tham số sql ... – canon

+1

@ fk2 '@ p0' *** là một tham số ***; nó không bao giờ được đánh giá là TSQL; nó có thể là bất kỳ nội dung chuỗi nào, không có bất kỳ rủi ro nào –

Các vấn đề liên quan