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

Tôi có thể sử dụng một câu lệnh được chuẩn bị sẵn bởi PDO để liên kết một số nhận dạng (một bảng hoặc tên trường) hoặc một từ khóa cú pháp không?

Tôi có thể sử dụng một câu lệnh do PDO chuẩn bị để liên kết một số nhận dạng (một bảng hoặc tên trường) hoặc một từ khóa cú pháp không?

Thật không may, câu lệnh chuẩn bị chỉ có thể đại diện cho một chữ dữ liệu. Vì vậy, một lỗi rất phổ biến là một truy vấn như sau:

$opt = "id";
$sql = "SELECT :option FROM t WHERE id=?";
$stm  = $pdo->prepare($sql);
$stm->execute(array($opt));
$data = $stm->fetchAll();

Phụ thuộc vào cài đặt PDO, truy vấn này sẽ dẫn đến lỗi (trong trường hợp sử dụng các câu lệnh chuẩn bị thực) hoặc chỉ là một chuỗi ký tự 'id' trong tập trường (trong trường hợp chuẩn bị giả lập).

Vì vậy, nhà phát triển phải tự chăm sóc các số nhận dạng - PDO không trợ giúp cho vấn đề này.

Để tạo một số nhận dạng động an toàn, người ta phải tuân theo 2 quy tắc nghiêm ngặt:

  • để định dạng mã nhận dạng đúng cách
  • để xác minh nó dựa trên danh sách trắng được mã cứng .

Để định dạng một số nhận dạng, người ta phải áp dụng 2 quy tắc sau:

  • Đính kèm số nhận dạng trong dấu gạch ngược.
  • Thoát các dấu gạch ngược bên trong bằng cách nhân đôi chúng.

Sau khi định dạng như vậy, có thể an toàn để chèn biến $ table vào truy vấn. Vì vậy, mã sẽ là:

$field = "`".str_replace("`","``",$field)."`";
$sql   = "SELECT * FROM t ORDER BY $field";

Tuy nhiên, mặc dù định dạng như vậy sẽ là đủ cho các trường hợp như ORDER BY, đối với hầu hết các trường hợp khác, có khả năng xảy ra một loại chèn khác:cho phép người dùng chọn một bảng hoặc một trường mà họ có thể xem, chúng tôi có thể tiết lộ một số thông tin nhạy cảm, như mật khẩu hoặc dữ liệu cá nhân khác. Vì vậy, tốt hơn hết là bạn nên kiểm tra các số nhận dạng động dựa trên danh sách các giá trị được phép. Đây là một ví dụ ngắn gọn:

$allowed = array("name","price","qty");
$key     = array_search($_GET['field'], $allowed);
$field   = $allowed[$key];
$query   = "SELECT $field FROM t"; //value is safe

Đối với các quy tắc từ khóa là giống nhau, nhưng tất nhiên là không có định dạng nào sẵn có - do đó, chỉ có thể đưa vào danh sách trắng và nên sử dụng:

$dir = $_GET['dir'] == 'DESC' ? 'DESC' : 'ASC'; 
$sql = "SELECT * FROM t ORDER BY field $dir"; //value is safe

Xem thêm ghi chú do người dùng này đóng góp trong tài liệu PHP: Ghi chú của người dùng trên PDO ::quote




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sao chép bảng MySQL, chỉ số và dữ liệu

  2. Cách Chèn dữ liệu từ một bảng cơ sở dữ liệu sang một bảng cơ sở dữ liệu khác trong Mysql

  3. Ví dụ về DATE_ADD () - MySQL

  4. Tìm kiếm đối sánh toàn bộ từ trong MySQL

  5. Truy vấn con so với tham gia