Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Một cuộc tấn công tiêm thành công với mysql_query, nhưng không thành công với mysqli_query

Tôi tin rằng:

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

có thể dễ dàng bị xâm phạm với các giá trị cho $idValue đó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";

Mặc dù tôi nhận thấy rằng bạn nói rằng nhiều câu lệnh đã bị vô hiệu hóa, nhưng điều không kinh khủng là trả về dữ liệu trái phép thay vì trực tiếp chỉnh sửa dữ liệu trong bảng, chẳng hạn như:

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

Trong khi với MySQLi thì có khả năng rằng phương pháp này có thể được sử dụng với prepared statements , điều này sẽ ngăn biến hoạt động bên ngoài trạng thái chỉ là 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à ký tự khóa được thoát, do đó ngăn chặn vi phạm bảo mật và trả lại các hàng trái phép.

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

Cũng như việc mặc áo giáp sẽ không khiến bạn trở nê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 dùng nữa và như Christopher đã nói, việc không còn được duy trì có nghĩa là số lượng lỗ hổng và các vấn đề với nó sẽ chỉ tăng lên 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 các câu lệnh theo cách tương tự như bạn đã viết các câu lệnh MySQL, khi đó bạn sẽ không có thêm biện pháp bảo vệ nào khỏi việc tiêm vào. Tuy nhiên, MySQLi cung cấp Câu lệnh chuẩn bị cách tiếp cận này làm tăng đáng kể khả năng phòng thủ chống lại việc đưa vào SQL, nhưng bản thân sự thay đổi của giao diện cơ sở dữ liệu cơ bản không mang lại cho bạn bất kỳ lợi ích hoặc biện pháp bảo vệ vốn có nào trừ khi bạn chọn tự viết mã những điều này bằng cách sử dụng các câu lệnh đã chuẩn bị sẵn .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giải thích Wordnet SQL

  2. Ngày giờ mới nhất từ ​​chỉ mục mysql duy nhất

  3. Làm thế nào để cập nhật trường để thêm giá trị vào giá trị hiện có?

  4. Cách lấy row_number trong MySQL

  5. kết hợp dữ liệu tương lai hàng tháng với chuỗi thời gian trước tháng trong MySQL