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

$ _SESSION có an toàn khi tiêm sql không?

Bạn không thực sự phải kiểm tra đầu vào là số, bởi vì trong MySQL, bất kỳ chuỗi nào, ví dụ:'123abc' trong ngữ cảnh số (như được so sánh với cột số nguyên id ) ngầm định chỉ lấy các chữ số và bỏ qua phần còn lại. Chuỗi không phải số như 'abc' chỉ đơn giản là có giá trị nguyên 0 vì không có chữ số đứng đầu.

Vấn đề là, các giá trị an toàn khỏi SQL injection nếu bạn sử dụng các tham số truy vấn. Cho dù đầu vào đến từ $ _SESSION hay một nguồn khác đều không liên quan. $ _SESSION không an toàn hoặc không an toàn đối với SQL injection, đó là cách bạn truyền dữ liệu vào truy vấn của mình mới là vấn đề quan trọng.

Tôi cũng sẽ đơn giản hóa mã để định dạng danh sách các trình giữ chỗ tham số:

$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));

Và quên bindParam (), chỉ cần truyền mảng vào execute() .

//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories` 
    WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();

Nhận xét lại của bạn:

Trong PDO, bạn có thể sử dụng các tham số được đặt tên như :id hoặc bạn có thể sử dụng các tham số vị trí, luôn là ? (nhưng không kết hợp hai loại này trong một truy vấn nhất định, hãy sử dụng loại này hoặc loại khác).

Truyền một mảng tới execute() tự động liên kết các phần tử mảng với các tham số. Một mảng đơn giản (tức là được lập chỉ mục bởi các số nguyên) dễ liên kết với các tham số vị trí.

Nếu bạn sử dụng các tham số được đặt tên, bạn phải chuyển một mảng kết hợp trong đó các khóa của mảng khớp với tên tham số. Các khóa mảng có thể được tùy chọn bắt đầu bằng : nhưng nó không bắt buộc.

Nếu bạn mới sử dụng PDO, việc đọc tài liệu . Có các ví dụ về mã và mọi thứ!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chèn vào bảng Mysql khi người dùng đóng trình duyệt?

  2. Làm thế nào để lấy khóa chính của bảng?

  3. Có cách nào để chỉ cài đặt ứng dụng khách mysql (Linux) không?

  4. Cập nhật và chọn trong một truy vấn

  5. MySQL đặt unique_checks, đặt các khóa vô hiệu hóa bảng Foreign_key_checks so với thay đổi