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

Bảo vệ SQL Injection

Đây không phải là không SQL Injection là gì. Bất kỳ lúc nào bạn sử dụng các tham số chưa được khử trùng trong truy vấn SQL của mình, bạn vẫn để cơ sở dữ liệu mở đối với SQL injection, điều này có thể không nhất thiết phải có mục tiêu hủy dữ liệu. Nó cũng có thể là để đánh cắp dữ liệu hoặc truy cập trái phép.

Hãy xem xét một tài khoản rất hạn chế, nơi tất cả những gì nó có thể làm là SELECT . Bạn viết một truy vấn để xác thực:

$sql = "SELECT COUNT(*) AS count
          FROM users 
         WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";

// check if returns a count of 1, if yes, log in

Với đầu vào bình thường, bạn mong đợi truy vấn trông giống như sau:

SELECT COUNT(*) AS count
  FROM users 
 WHERE user_id = 'username' AND pass='********'

Mà sẽ trả về 1 làm số nếu cả tên người dùng và thẻ vượt qua đều khớp. Bây giờ kẻ tấn công cố gắng đăng nhập với tư cách quản trị viên. Vì bạn chưa làm sạch thông tin đầu vào của mình nên chúng sẽ gửi $_POST['user'] as:admin'; -- . Toàn bộ truy vấn trở thành:

SELECT COUNT(*) AS count
  FROM users 
 WHERE user_id = 'admin'; -- AND pass='********'

Mọi thứ sau -- là một nhận xét, vì vậy điều này bỏ qua điều kiện khác và trả về 1 bất kể. Vậy là xong, bạn vừa cấp quyền truy cập quản trị viên độc hại cho người dùng. Đó là cách một số cuộc tấn công thực sự được thực hiện. Bạn bắt đầu với một tài khoản có đặc quyền thấp và thông qua các lỗ hổng bảo mật, bạn cố gắng giành quyền truy cập vào nhiều đặc quyền hơn.

Một câu chuyện ngắn, có một tài khoản trên toàn ứng dụng với các đặc quyền bị hạn chế (ví dụ:không DROP , ALTER , v.v.) là tốt. Không bao giờ cung cấp cho bất kỳ ai hoặc bất kỳ ứng dụng nào nhiều đặc quyền hơn mức họ cần. Tuy nhiên, để ngăn việc đưa vào SQL, hãy sử dụng 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. TẢI DỮ LIỆU không được phép trong các thủ tục được lưu trữ

  2. truy vấn chèn jOOQ với các khóa đã tạo trả về

  3. SQL Injection Protection - dấu nháy đơn

  4. Không thể AES_DECRYPT sau AES_ENCRYPT trong mysql

  5. E_WARNING:Lỗi khi gửi gói STMT_PREPARE. PID =*