2008-09-16 19 views

Trả lời

23

Có, có. Một đoạn trích từ Wikipedia

"SELECT * FROM data WHERE id = " + a_variable + ";"

Rõ ràng từ tuyên bố này mà tác giả dự định a_variable là một số tương quan đến lĩnh vực "id". Tuy nhiên, nếu nó là trong thực tế, một chuỗi sau đó người dùng cuối có thể thao tác các tuyên bố như họ chọn, do đó bỏ qua sự cần thiết cho các ký tự thoát. Ví dụ, đặt a_variable để

1;DROP TABLE users

sẽ thả (xóa) các "người sử dụng" bảng từ cơ sở dữ liệu, kể từ khi SQL sẽ được trả lại như sau:

SELECT * FROM DATA WHERE id=1;DROP TABLE users;

SQL injection được không một cuộc tấn công đơn giản để chiến đấu. Tôi sẽ nghiên cứu rất cẩn thận nếu tôi là bạn.

+0

Cần lưu ý rằng chỉ xảy ra nếu hệ thống của bạn cho phép bạn thực hiện nhiều truy vấn SQL cùng một lúc. PHP 'mysql_query' không. – DisgruntledGoat

15

Có, tùy thuộc vào tuyên bố bạn đang sử dụng. Bạn nên tự bảo vệ mình bằng cách sử dụng các thủ tục được lưu trữ, hoặc ít nhất là các truy vấn được tham số hóa.

Xem WikiPedia để phòng ngừa mẫu.

+0

Nếu tôi có thể mod bạn lên 1 nghìn lần, tôi sẽ làm như vậy. Trừ khi bạn đang viết trình điều khiển/thư viện cung cấp tham số, tôi không thể nghĩ ra lý do _any_ để thậm chí xem xét bất cứ điều gì khác để bảo vệ khỏi việc tiêm SQL. –

2

. . . uh về 50000000 cách khác

lẽ somthing như 5; drop table employees; --

kết quả sql có thể cái gì đó như: select * from somewhere where number = 5; drop table employees; -- and sadfsf

(-- bắt đầu một bình luận)

0

Nó phụ thuộc vào cách bạn đặt cùng truy vấn, nhưng về bản chất thì có.

Ví dụ, trong Java nếu bạn đã làm điều này (ví dụ cố tình nghiêm trọng):

String query = "SELECT name_ from Customer WHERE ID = " + request.getParameter("id"); 

sau đó có một cơ hội tốt bạn đang mở lòng ra đón một cuộc tấn công tiêm.

Java có một số công cụ hữu ích để bảo vệ chống lại các, chẳng hạn như PreparedStatements (nơi bạn vượt qua trong một chuỗi như "SELECT name_ từ khách hàng ĐÂU ID =?" Và lớp JDBC xử lý thoát trong khi thay thế các thẻ? Cho bạn), nhưng một số ngôn ngữ khác không hữu ích cho việc này.

1

Có, hoàn toàn: tùy thuộc vào phương ngữ SQL của bạn và như vậy, có nhiều cách để đạt được tiêm không sử dụng dấu nháy đơn.

Bảo vệ đáng tin cậy duy nhất chống lại các cuộc tấn công SQL injection là sử dụng hỗ trợ câu lệnh SQL được tham số được cung cấp bởi giao diện cơ sở dữ liệu của bạn.

0

Thing là đầu vào chính xác của dấu nháy đơn và bạn phải thoát chúng bằng cách tăng gấp đôi chúng khi bạn đang sử dụng SQL nội dòng trong mã của bạn. Những gì bạn đang tìm kiếm là một mô hình regex như:

\;.*--\ 

Một Dấu chấm phẩy dùng để sớm kết thúc báo cáo kết quả chính hãng, một số SQL tiêm tiếp theo là một dấu nối đôi để nhận xét ra các SQL dấu từ báo cáo kết quả chính hãng gốc. Các dấu gạch nối có thể bị bỏ qua trong cuộc tấn công.

Vì vậy, câu trả lời là: Không, chỉ cần xóa dấu nháy đơn không đảm bảo an toàn cho bạn với SQL Injection.

1

Thay vì cố gắng tìm ra các ký tự cần lọc ra, tôi sẽ dính vào các truy vấn được tham số thay thế và xóa hoàn toàn vấn đề.

6

Có, điều đó là hoàn toàn có thể.

Nếu bạn có một hình thức mà bạn mong đợi một số nguyên để làm cho câu lệnh SELECT tiếp theo của bạn, sau đó bạn có thể nhập bất cứ điều gì tương tự:

SELECT * FROM thingy ĐÂU attributeID =

  • 5 (câu trả lời tốt, không có vấn đề gì)
  • 5; DROP bảng users; (xấu, xấu, xấu ...)

Chi tiết trang web sau đây kỹ thuật phun SQL cổ điển hơn nữa: SQL Injection cheat sheet.

Sử dụng truy vấn được yêu cầu hoặc quy trình được lưu trữ không tốt hơn. Đây chỉ là các truy vấn được tạo trước bằng cách sử dụng các tham số được truyền, đây cũng có thể là nguồn tiêm. Nó cũng được mô tả trên trang này: Attacking Stored Procedures in SQL.

Bây giờ, nếu bạn chặn báo giá đơn giản, bạn chỉ ngăn chặn một tập hợp tấn công nhất định. Nhưng không phải tất cả trong số họ.

Như mọi khi, không tin tưởng dữ liệu đến từ bên ngoài. Lọc chúng tại các 3 cấp:

  • mức giao diện cho các công cụ rõ ràng (một danh sách thả xuống chọn danh sách là tốt hơn so với một trường văn bản miễn phí)
  • mức logic để kiểm tra liên quan đến bản chất dữ liệu (int, chuỗi, chiều dài) , quyền (loại dữ liệu này có thể được người dùng này sử dụng tại trang này) ...
  • Cấp truy cập cơ sở dữ liệu (thoát khỏi báo giá đơn giản ...).

Hãy vui vẻ và đừng quên kiểm tra WikiPedia để có câu trả lời.

/Vey

+0

Chỉ cần lưu ý rằng tên miền lưu trữ bài viết "Thủ tục lưu trữ tấn công trong SQL" hiện có vẻ không còn tồn tại. – Funka

2

Ngoài ra, ngay cả khi bạn chỉ tìm kiếm dấu móc lửng, bạn không muốn xóa nó. Bạn muốn thoát khỏi số. Bạn làm điều đó bằng cách thay thế mọi dấu nháy đơn bằng hai dấu nháy đơn.

Nhưng các truy vấn được tham số hóa/quy trình được lưu trữ tốt hơn rất nhiều.

3

SQL nội tuyến tham số hoặc các thủ tục được lưu trữ tham số là cách tốt nhất để tự bảo vệ mình.Như những người khác đã chỉ ra, chỉ cần loại bỏ/thoát khỏi ký tự trích dẫn đơn là không đủ.

Bạn sẽ nhận thấy rằng tôi đặc biệt nói về các thủ tục được lưu trữ "được tham số hóa". Đơn giản chỉ cần sử dụng một thủ tục được lưu trữ là không đủ hoặc nếu bạn trở lại để ghép nối các tham số được truyền của thủ tục với nhau. Nói cách khác, gói chính xác câu lệnh SQL dễ bị tổn thương trong một thủ tục lưu sẵn không làm cho nó an toàn hơn. Bạn cần sử dụng các tham số trong thủ tục lưu trữ của bạn giống như bạn làm với SQL nội dòng.

0

Tôi chỉ có thể lặp lại những gì người khác đã nói. SQL tham số là con đường để đi. Chắc chắn, nó là một chút đau ở mông mã hóa nó - nhưng một khi bạn đã làm nó một lần, sau đó nó không phải là khó khăn để cắt và dán mã đó, và thực hiện các sửa đổi bạn cần. Chúng tôi có rất nhiều ứng dụng .Net cho phép khách truy cập trang web chỉ định một loạt các tiêu chí tìm kiếm và mã xây dựng câu lệnh SQL Select khi đang chạy - nhưng mọi thứ có thể đã được người dùng nhập vào tham số.

6

Tôi đề nghị bạn chuyển các biến làm tham số và không xây dựng SQL của riêng bạn. Nếu không thì sẽ có một cách để thực hiện việc tiêm SQL, theo cách mà chúng ta hiện không biết.

Mã bạn tạo ra là sau đó một cái gì đó như:

' Not Tested 
var sql = "SELECT * FROM data WHERE id = @id"; 
var cmd = new SqlCommand(sql, myConnection); 
cmd.Parameters.AddWithValue("@id", request.getParameter("id")); 

Nếu bạn có một tên như tôi với một 'trong đó. Nó là rất khó chịu rằng tất cả các '-characters được loại bỏ hoặc đánh dấu là không hợp lệ.

Bạn cũng có thể muốn xem điều này Stackoverflow question about SQL Injections.

+0

Đây chắc chắn là phương pháp hay nhất –

0

Khi bạn đang mong đợi một tham số số, bạn nên luôn xác thực đầu vào để đảm bảo đầu vào là số. Ngoài việc giúp bảo vệ chống tiêm, bước xác thực sẽ làm cho ứng dụng trở nên thân thiện với người dùng hơn.

Nếu bạn nhận id = "hello" khi bạn mong đợi id = 1044, tốt hơn là trả về lỗi hữu ích cho người dùng thay vì để cơ sở dữ liệu trả về lỗi.

2

Vì đây là một câu hỏi tương đối cũ, tôi sẽ không bận tâm viết một câu trả lời hoàn chỉnh và toàn diện, vì hầu hết các khía cạnh của câu trả lời đó đã được đề cập ở đây bởi một poster hoặc một câu trả lời khác.
Tôi thấy cần thiết, tuy nhiên, để đưa ra một vấn đề khác không được ai chạm vào đây - SQL Smuggling. Trong một số trường hợp nhất định, có thể "buôn lậu" nhân vật báo giá "vào truy vấn của bạn ngay cả khi bạn đã cố gắng xóa nó. Trong thực tế, điều này có thể ngay cả khi bạn sử dụng các lệnh thích hợp, thông số, các Stored Procedure vv

Kiểm tra các báo cáo nghiên cứu đầy đủ tại http://www.comsecglobal.com/FrameWork/Upload/SQL_Smuggling.pdf (tiết lộ, Tôi là nhà nghiên cứu chính về vấn đề này) hoặc chỉ google "SQL chống buôn lậu ".

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