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.
Đó 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
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
đ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. –