2015-06-28 26 views
5

Cập nhật: Đã có một số phản ứng chiếu sáng này, và những điểm chính là rằng mysql chức năng đang bị phản đối, và cũng là mysqli phép bạn sử dụng chuẩn bị phát biểu. Điều đó làm cho rất nhiều ý nghĩa, và là hữu ích, trong khi chỉ "sử dụng mysqli" là không xây dựng, cũng không hữu ích, theo ý kiến ​​của tôi.Một cuộc tấn công tiêm rằng thành công với mysql_query, nhưng không thành công với mysqli_query

Bất cứ khi nào câu hỏi PHP và MySQL được yêu cầu trên SO và OP có mã sử dụng mysql_query, phản ứng cộng đồng theo bản năng là nhận xét rằng họ nên sử dụng nhóm chức năng mysqli thay thế.

Bạn có thể vui lòng cung cấp trường hợp người dùng độc hại có thể khởi chạy tấn công tiêm thành công không nếu mã của tôi đang sử dụng mysql_query, nhưng nó sẽ bị cản trở nếu cùng một cuộc tấn công được thực hiện, nhưng mã đã sử dụng các chức năng mysqli? Giả sử nhiều truy vấn trong một câu lệnh bị tắt, như trường hợp điển hình.

+5

Đó thực sự là tư vấn sai lầm. 'mysqli' vốn không an toàn hơn. Tất cả phụ thuộc vào việc sử dụng các câu lệnh chuẩn bị → điều này xảy ra khá phức tạp với mysqli (- nhưng dễ sử dụng hơn với PDO). – mario

+1

Cũng hãy nhớ rằng 'mysql_query' đã không được chấp nhận. Đó luôn là lời khuyên âm thanh để đảm bảo mọi người không viết bằng mã không dùng nữa. – christopher

+0

điều này gần như dường như thuộc về Meta, cách bạn bắt đầu câu hỏi của mình. –

Trả lời

6

Tôi đã được dẫn đến tin rằng:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' "); 

có thể dễ dàng thỏa hiệp với các giá trị cho $idValue mà đóng ' và sau đó thêm các lệnh bổ sung, chẳng hạn như

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL"; 

Trong khi tôi nhận ra bạn tuyên bố rằng nhiều báo cáo bị vô hiệu hóa, điều không phải là khủng khiếp là trả lại dữ liệu trái phép thay vì chỉnh sửa dữ liệu trực tiếp trong bảng, chẳng hạn như:

$idValue = "z' OR name IS NOT NULL OR name = 'x"; 

Trong khi với MySQLi có là khả rằng phương pháp này có thể được sử dụng với prepared statements, có chức năng chặn diễn biến bên ngoài về tình trạng của nó như là chỉ một biến. Chẳng hạn như:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1"); 
mysqli->bind_param("s",$idValue); 
mysqli->execute(); 

sự hiểu biết của tôi về bind_param là biến sẽ có tất cả các từ khóa MySQL và các nhân vật chủ chốt trốn thoát do đó ngăn ngừa các vi phạm an ninh và sự trở lại của hàng trái phép.

Đây là lựa chọn mà MySQL không có. Các câu lệnh đã được chuẩn bị trợ giúp với cải thiện an ninh tiêm nhưng chúng sẽ không ngăn chặn tấn công tiêm một mình, nhưng nhiều hơn nên được sử dụng như là một phần của chiến lược rộng hơn của lập trình viên.

Cũng như mặc áo giáp cơ thể sẽ không làm cho bạn bất khả chiến bại, nhưng nó sẽ cải thiện đáng kể cơ hội sống sót của bạn. MySQLi không phải là một viên đạn ma thuật, và cũng không phải là PDO, nhưng chúng sẽ cải thiện mức độ bảo mật tổng thể.

MySQL cũng không được chấp nhận và như đã nêu bởi Christopher, không còn được duy trì có nghĩa là số lỗ và vấn đề với nó sẽ chỉ tăng khi các công nghệ khác tiếp tục phát triển.

Tóm tắt

Nếu bạn viết MySQL i báo cáo theo cách tương tự như bạn đã viết báo cáo MySQL, sau đó bạn sẽ không có sự bảo vệ bổ sung từ tiêm. Tuy nhiên, MySQLi cung cấp chuẩn bị phát biểu cách tiếp cận mà không làm tăng đáng kể việc bảo vệ chống lại SQL injection, nhưng sự thay đổi của giao diện cơ sở dữ liệu cơ bản trong tự nó không cung cấp cho bạn bất kỳ lợi ích cố hữu hoặc bảo vệ trừ khi bạn chọn mã này vào bản thân sử dụng chuẩn bị phát biểu.

3

Tôi nghĩ, không có trường hợp như vậy. Quan trọng hơn là hỗ trợ MySQLi cho các câu lệnh đã chuẩn bị, đó là phương pháp đáng tin cậy nhất để ngăn chặn việc tiêm SQL. Nếu bạn sử dụng API MySQL cũ, các tính năng nâng cao này không được hỗ trợ. Cả MySQL và MySQLi đều có chức năng mysql * _real_escape_string, có khả năng tấn công mà không sử dụng dấu ngoặc kép, như 1 OR 1.

+1

Tôi nghĩ rằng sự sẵn có của các câu lệnh đã chuẩn bị là một trong nguyên tắc chính của việc muốn chuyển từ MySQL sang MySQLi, cách thức các câu lệnh chuẩn bị hoạt động làm giảm các cơ hội tiêm. – Martin

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