Các tuyên bố đã chuẩn bị rất hữu ích chống lại SQL tiêm.
Các câu lệnh được chuẩn bị và các tham số ràng buộc
Một câu lệnh đã chuẩn bị là một tính năng được sử dụng để thực hiện các câu lệnh SQL (hoặc tương tự) giống nhau với hiệu quả cao.
Các tuyên bố chuẩn bị về cơ bản hoạt động như thế này:
- Chuẩn bị: Một mẫu câu lệnh SQL được tạo và gửi đến cơ sở dữ liệu. Một số giá trị nhất định không được xác định, được gọi là tham số (được dán nhãn "?"). Ví dụ: Chèn vào các giá trị MyGuests (?,?,?)
- Cơ sở dữ liệu phân tích cú pháp, biên dịch và thực hiện tối ưu hóa truy vấn trên mẫu câu lệnh SQL và lưu trữ kết quả mà không cần thực hiện nó
- Thực thi: Sau đó, ứng dụng liên kết các giá trị với các tham số và cơ sở dữ liệu thực thi câu lệnh. Ứng dụng có thể thực thi câu lệnh nhiều lần như nó muốn với các giá trị khác nhau
So với việc thực thi các câu lệnh SQL trực tiếp, các câu lệnh được chuẩn bị có ba lợi thế chính:
- Các câu lệnh đã chuẩn bị giảm thời gian phân tích cú pháp khi việc chuẩn bị trên truy vấn chỉ được thực hiện một lần (mặc dù câu lệnh được thực thi nhiều lần)
- Các tham số ràng buộc giảm thiểu băng thông cho máy chủ vì bạn chỉ cần gửi các tham số mỗi lần chứ không phải toàn bộ truy vấn
- Các câu lệnh được chuẩn bị rất hữu ích đối với tiêm SQL, bởi vì các giá trị tham số, được truyền sau đó bằng cách sử dụng một giao thức khác, không cần phải thoát ra một cách chính xác. Nếu mẫu câu lệnh gốc không có nguồn gốc từ đầu vào bên ngoài, thì SQL tiêm không thể xảy ra.
Các tuyên bố đã chuẩn bị trong mysqli
Ví dụ sau sử dụng các câu lệnh đã chuẩn bị và tham số ràng buộc trong MySQLI:
Ví dụ (mysqli với các câu lệnh đã chuẩn bị)
$conn->close();
?>
Các dòng mã để giải thích từ ví dụ trên:
"Chèn vào các giá trị của MyGuests (FirstName, LastName, Email) (?,?,?)" "
Trong SQL của chúng tôi, chúng tôi chèn một dấu hỏi (?) Khi chúng tôi muốn thay thế trong một số nguyên, chuỗi, gấp đôi hoặc giá trị blob.
Sau đó, hãy xem hàm Bind_Param ():
$ STMT-> BIND_PARAM ("SSS", $ FirstName, $ LastName, $ Email);
Hàm này liên kết các tham số với truy vấn SQL và cho biết cơ sở dữ liệu các tham số là gì. Đối số "SSS" liệt kê các loại dữ liệu mà các tham số là. Nhân vật S nói với MySQL rằng tham số là một chuỗi.
Đối số có thể là một trong bốn loại:
- Tôi - Số nguyên
- D - gấp đôi
- S - Chuỗi
- B - Blob
Chúng ta phải có một trong số này cho mỗi tham số.
Bằng cách nói với MySQL loại dữ liệu nào sẽ xảy ra, chúng tôi giảm thiểu nguy cơ tiêm SQL.
Lưu ý: Nếu chúng tôi muốn chèn bất kỳ dữ liệu nào từ các nguồn bên ngoài (như đầu vào của người dùng), điều rất quan trọng là dữ liệu được vệ sinh và xác thực. If we want to insert any data from external sources (like user input), it is very important that the data is sanitized and validated.
Báo cáo chuẩn bị trong PDO
Ví dụ sau sử dụng các câu lệnh đã chuẩn bị và tham số ràng buộc trong PDO: