2012-09-12 37 views
9

Liệu execute($input_parameter) có bảo vệ khỏi việc tiêm sql giống như bindParam/bindValue không?

Nếu câu trả lời là có, bindParam()/bindValue()/execute() là bất khả xâm phạm đối với bất kỳ cuộc tấn công bằng cách chèn sql nào? Hoặc tôi cần phải có biện pháp để ngăn chặn các cuộc tấn công như vậy ?.

Cảm ơn bạn đã trợ giúp !.

Trả lời

0

Vâng, nó cũng giống như vậy. Tôi không thể nói rằng nó là bất khả xâm phạm, bởi vì động cơ SQL bên dưới có thể bị tổn thương. Nhưng điều đó thực sự không nằm trong tay bạn nữa.

Vì vậy, vì tất cả các lý do thực tế, có, an toàn của nó.

EDIT: Hãy xem PHP Documentation (ví dụ thứ nhất và thứ hai). Một là với bindParam() và người kia sử dụng execute().

2

Theo như execute($input_parameters) an toàn như các bước riêng biệt bindParam/bindValue/execute, câu trả lời dường như về cơ bản là có.

Tuy nhiên, bạn vẫn có thể cần thực hiện các biện pháp khác tùy thuộc vào cách bạn đã tạo chuỗi truy vấn mà bạn chuyển đến cuộc gọi PDO::prepare của mình. Nó không phải luôn luôn có thể tham số-ize tất cả mọi thứ trong chuỗi truy vấn chuẩn bị. Ví dụ: bạn không thể sử dụng tham số cho tên bảng hoặc cột. Nếu bạn cho phép dữ liệu người dùng hoặc bất kỳ dữ liệu bên ngoài nào vào chuỗi truy vấn đó, bạn vẫn phải khử trùng dữ liệu đó trước khi chuyển chuỗi đến prepare. Tham khảo những câu hỏi stackoverflow để biết thêm chi tiết:

Nói chung bạn nên lọc tất cả các dữ liệu đầu vào dù sao, vì vậy nếu bạn muốn trở thành thêm an toàn, bạn có thể khử trùng bất kỳ dữ liệu đầu vào được dành cho công cụ loại SQL sử dụng các bộ lọc phù hợp với nhu cầu của bạn hoặc thậm chí viết hàm tùy chỉnh FILTER_CALLBACK nếu bạn muốn. Trong trường hợp tên bảng hoặc cột đến từ dữ liệu do người dùng cung cấp, kỹ thuật xác thực phổ biến là kiểm tra các giá trị dựa vào các mảng tên được phép.

Hy vọng điều này sẽ hữu ích. Chúc may mắn. Giữ an toàn! ;)

Các vấn đề liên quan