2010-04-28 29 views
7

Khi tôi bắt đầu viết các câu lệnh SQL đầu tiên trong các chương trình của mình, tôi cảm thấy khá thoải mái khi bảo vệ bản thân khỏi SQL Injection với một phương thức rất đơn giản mà một đồng nghiệp chỉ cho tôi. Nó thay thế tất cả các dấu nháy đơn với hai dấu nháy đơn.Các câu lệnh SQL tham số so với phương thức rất đơn giản

Vì vậy, ví dụ: có một trường tìm kiếm mà bạn có thể nhập tên người dùng để tìm kiếm trong tùy chỉnh. Nếu bạn sẽ nhập

Phêrô làm tóc

câu lệnh SELECT sẽ trông như thế

SELECT * 
FROM Customers 
WHERE Customername = 'Peter''s Barbershop' 

Nếu bây giờ là một kẻ tấn công sẽ chèn này:

';DROP TABLE FOO; -- 

Những tuyên bố sẽ xem xét như:

SELECT * 
FROM Customers 
WHERE Customername = ''';DROP TABLE FOO;--' 

Nó sẽ không thả bất kỳ bảng, nhưng tìm kiếm trên customertable cho CustomerName '; DROP TABLE FOO; - đó, tôi cho rằng, sẽ không thể được tìm thấy ;-)

Bây giờ sau một thời gian viết báo cáo và bảo vệ bản thân mình chống lại SQL-Injection bằng phương pháp này, tôi đọc rằng nhiều nhà phát triển sử dụng các câu lệnh được tham số hóa, nhưng tôi chưa bao giờ đọc một bài viết mà phương thức "của chúng tôi" đã được sử dụng. Vì vậy, chắc chắn có một lý do chính đáng cho nó.

Kịch bản nào sẽ tham số hóa các câu lệnh được bao gồm nhưng phương pháp của chúng tôi không? Lợi thế của các câu lệnh được tham số hóa so với phương pháp của chúng ta là gì?

Cảm ơn
Philipp

Trả lời

4

Truy vấn được parametrized có nhiều proc hơn mức phòng thủ để chèn sql.

  1. Giải quyết vấn đề với ngày & thời gian tạo thành & phân tích cú pháp.
  2. Bạn có thể chuẩn bị kế hoạch thực hiện cho truy vấn được yêu cầu.
  3. Bảo vệ phun sql.

Tôi không thể nhớ bây giờ vì một ưu điểm khác :).

Tuy nhiên cách "tăng gấp đôi mọi dấu ngoặc kép" có vấn đề với các trường có độ dài ký tự giới hạn.

Ví dụ:

  • Trang có hộp cho "biệt danh" mà có thể là 10 nhân vật dài.
  • Người dùng chèn "Không quan tâm" - chính xác 10 ký tự.

Bây giờ nếu bạn tăng gấp đôi dấu ngoặc kép, giá trị có 11 ký tự và cơ sở dữ liệu sẽ "cắt" và bạn nhận được một giá trị khác trong db so với người dùng đã nhập.

Vì vậy, tôi khuyên bạn nên tham số.

+0

Ví dụ "Không quan tâm" không hoạt động đối với MS SQL Server 2005 và 2008. Chúng chấp nhận chuỗi dài hơn nếu có dấu ngoặc kép trong đó. Nhưng +1 và chấp nhận câu trả lời cho 3 điểm đầu tiên. –

0

những ưu điểm của báo cáo tham số là gì so với phương pháp của chúng tôi?

Lợi thế là khó thực hiện sai hơn; bạn không thể làm phương pháp được tham số hóa và quên thay thế dấu ngoặc kép. Ngoài ra, thay thế dấu ngoặc kép là dễ bị tổn thương nếu bạn làm điều đó hai lần.

Điểm bất lợi của các truy vấn được tham số hóa (và lý do tôi không bao giờ sử dụng chúng) là sự phức tạp. Bạn có thể viết mười lần nhiều truy vấn đặc biệt trước khi bạn nhận được RSI.

2

Một lợi thế lớn nhất là giải pháp của bạn dựa trên một nhà phát triển nhớ thêm nhân vật, rõ ràng trình biên dịch sẽ không phàn nàn. Đó là nguy hiểm.

Thứ hai, hiệu suất phải được tăng cường với các câu lệnh SQL được tham số hóa, như Jeff chỉ ra here (trong !!!).

+0

Cảm ơn bạn đã liên kết! –

+0

Không sao cả. Bạn đang sử dụng ngôn ngữ lập trình nào trong lớp ứng dụng? –

+0

Tôi đang sử dụng VB.NET. –

1

Một ưu điểm là bản thân người lái xe sẽ xác định những gì anh ta phải trốn thoát và những gì không cần phải trốn thoát.phương pháp của bạn có thể bị phá vỡ với một đầu vào như thế này:

\'; DROP TABLE foo;-- 

nào sẽ cho kết quả trong

SELECT * 
    FROM Customers 
    WHERE Customername = '\'';DROP TABLE FOO;--' 

Các báo đầu tiên được thoát, thứ hai không và đóng chuỗi.

+0

Nhận dạng cơ sở dữ liệu nào \ làm lối thoát cho '''? – Andomar

+0

Ồ, giờ tôi đã bình chọn rất nhanh, tôi đã thử cái này nhưng nó không hoạt động. Câu lệnh này trông giống như câu lệnh bạn đã đăng, nhưng toàn bộ phần DROP TABLE được viết lại thành chuỗi.\ Đã không làm bất cứ điều gì, nó chỉ là ký tự đầu tiên của chuỗi. –

+1

Và kịch bản của Bobby là, tất nhiên, điều thứ hai mà kẻ tấn công sẽ thử! Quy tắc lập trình phòng thủ # 1: Không bao giờ cuộn bảo mật của riêng bạn. – dthrasher

1

Câu trả lời ngắn:
Bạn nên sử dụng truy vấn được tham số hóa đơn giản vì máy chủ cơ sở dữ liệu biết rõ hơn bạn cần phải loại bỏ ký tự nào.

Câu trả lời dài:
' không nhất thiết là ký tự đặc biệt duy nhất cần thoát. Các ký tự đặc biệt này khác với máy chủ DB đến máy chủ DB. Ví dụ, MySQL sử dụng \ làm ký tự thoát (trừ khi sql_mode=NO_BACKSLASH_ESCAPES được đặt). Do đó, ''\' có nghĩa là giống nhau.

Điều này không đúng với Oracle.

+0

MySQL (hoặc ít nhất là cài đặt của tôi) không nhận dạng \ như một ký tự thoát. – Andomar

+1

@Andomar: Hành vi của MySQL cũng phụ thuộc vào chế độ máy chủ. Nếu 'sql_mode = NO_BACKSLASH_ESCAPES' hoặc một chế độ khác bao gồm nó được thiết lập, \ không còn được phép thoát khỏi các ký tự: http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html# sqlmode_no_backslash_escapes – Powerlord

+0

+1. Có thể có các octet nhị phân trong đầu vào hoặc kết nối DB có thể có khái niệm về bộ ký tự hỗ trợ mã thoát của bạn không, v.v. – pilcrow

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