Tôi đang tái kỹ thuật một trang web hướng PHP sử dụng cơ sở dữ liệu tối thiểu. Phiên bản gốc được sử dụng "pseudo-prepared-statements" (các hàm PHP đã trích dẫn và thay thế tham số) để ngăn chặn các cuộc tấn công tiêm và tách logic cơ sở dữ liệu khỏi logic trang. Có vẻ như tự nhiên để thay thế các chức năng đặc biệt này bằng một đối tượng sử dụng PDO và các câu lệnh chuẩn bị thực sự, nhưng sau khi đọc xong, tôi không chắc lắm. PDO vẫn có vẻ như là một ý tưởng tuyệt vời, nhưng một trong những điểm bán hàng chính của các báo cáo chuẩn bị là có thể tái sử dụng chúng ... mà tôi sẽ không bao giờ làm. Đây là thiết lập của tôi:Khi * không * sử dụng câu lệnh đã chuẩn bị?
- Các câu lệnh đều đơn giản giản dị. Hầu hết đều ở dạng
SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1
. Câu lệnh phức tạp nhất trong lô chỉ đơn giản là ba lựa chọn như vậy được nối cùng vớiUNION ALL
s. - Mỗi lần truy cập trang thực thi tối đa một tuyên bố và chỉ thực thi một lần.
- Tôi đang ở trong một môi trường được lưu trữ và do đó, sự rùng rợn của các máy chủ của họ bằng cách thực hiện bất kỳ "kiểm tra căng thẳng" nào.
Do sử dụng câu lệnh chuẩn bị, tối thiểu, gấp đôi số lượng chuyến đi khứ hồi cơ sở dữ liệu tôi đang tạo, tôi có nên tránh chúng không? Tôi có thể sử dụng PDO::MYSQL_ATTR_DIRECT_QUERY
để tránh chi phí cho nhiều chuyến đi cơ sở dữ liệu trong khi vẫn giữ được lợi ích của việc bảo vệ và phòng ngừa tiêm? Hoặc thực hiện các cuộc gọi nhị phân được API chuẩn bị đã sử dụng thực hiện đủ tốt so với thực hiện các truy vấn không được chuẩn bị mà tôi không nên lo lắng về nó?
EDIT:
Cảm ơn tất cả những lời khuyên tốt, folks. Đây là nơi tôi ước tôi có thể đánh dấu nhiều hơn một câu trả lời là "được chấp nhận" - nhiều quan điểm khác nhau. Cuối cùng, mặc dù, tôi phải cung cấp cho rick do của mình ... mà không có câu trả lời của mình tôi sẽ có blissfully đi tắt và thực hiện hoàn toàn sai điều thậm chí sau khi sau lời khuyên của mọi người. :-)
Phát biểu được mô phỏng được mô phỏng!
** Cẩn thận **: PDO giả lập các câu lệnh được chuẩn bị dễ bị tấn công với SQL injection nếu bộ ký tự được thay đổi khi chạy. Xem [câu trả lời này] (http://stackoverflow.com/a/60496/1862009) và [câu trả lời này] (http://stackoverflow.com/a/12202218/1862009) để được giải thích. – toxalot
Thật dễ dàng: Nếu bạn biết * chuỗi xuất phát từ ứng dụng của bạn và không thể bị người dùng thao tác, thì không cần phải có các câu lệnh chuẩn bị, bởi vì không có gì để tiêm. Nếu bạn không chắc chắn (xấu, nhưng trong các dự án lớn hơn không tránh được) sử dụng tuyên bố chuẩn bị. –