2010-06-29 34 views
15

Trên PDO::Prepare page nó khẳng định,Các câu lệnh chuẩn bị PHP PDO có cần phải được thoát không?

"và giúp ngăn ngừa các cuộc tấn công SQL injection bằng cách loại bỏ sự cần thiết phải tự trích dẫn các thông số"

Biết được điều này, là có một chức năng PHP như mysql_real_escape_string() mà sẽ chăm sóc thoát stings cho PDO? Hay PDO có chăm sóc tất cả thoát cho tôi không?

EDIT

Tôi nhận ra bây giờ mà tôi hỏi những câu hỏi sai. Câu hỏi của tôi thực sự là, "PDO làm gì cho tôi?" Mà tôi nhận ra bây giờ với những câu trả lời rằng nó thực sự chỉ loại bỏ sự cần thiết phải thoát khỏi dấu ngoặc kép. Nhưng tôi vẫn sẽ cần phải làm bất kỳ PHP khác khử trùng cuộc gọi trên các giá trị mà tôi vượt qua để thực hiện chức năng. Chẳng hạn như htmlentities(), strip_tags() ... etc ...

+5

Không có chức năng "khử trùng" phổ biến trên thế giới. Nó giống như cuộc sống thực: rửa tay, sử dụng bao cao su và giữ tiền trong lồng ngực an toàn là tất cả cho an toàn. Nhưng nó không có nghĩa là táo của bạn, được rửa sạch và bọc trong bao cao su và đưa vào ngực an toàn, được coi là an toàn. Mỗi chức năng vệ sinh là vì mục đích riêng của nó. Không yêu cầu an toàn HTML từ chức năng cơ sở dữ liệu. Nó woul là lạ. –

+0

@Col. Shrapnel +1 Nice ví dụ lol ..... – Metropolis

Trả lời

24

PDO không thoát khỏi các biến. Các biến và lệnh SQL được chuyển độc lập qua kết nối MySQL. Và Trình mã thông báo SQL (trình phân tích cú pháp) không bao giờ xem xét các giá trị. Giá trị chỉ được sao chép đúng nguyên văn vào bộ nhớ cơ sở dữ liệu mà không có khả năng gây hại. Đó là lý do tại sao không cần phải marshall dữ liệu với các báo cáo chuẩn bị.

Lưu ý rằng đây chủ yếu là lợi thế về tốc độ. Với mysql_real_escape_string() bạn đầu tiên marshall biến của bạn trong PHP, sau đó gửi một lệnh SQL không hiệu quả đến máy chủ, mà phải tốn kém tách biệt lệnh SQL thực tế từ các giá trị một lần nữa. Đó là lý do tại sao người ta thường nói rằng lợi thế bảo mật chỉ là tiềm ẩn, không phải là lý do chính để sử dụng PDO.

Nếu bạn concat và lệnh SQL không thực sự sử dụng statments sẵn sàng, sau đó vâng, vẫn còn là một chức năng thoát cho PDO (không giỏi!): $pdo->quote($string)

+0

Thực ra điều này là không chính xác. Cả pdo và adodb đều sử dụng 'mysql_real_escape_string()' khi kết nối với mysql. Tôi đã xem xét mã. – rook

+1

@Col. Shrapnel pdo được viết bằng C++ và adodb được viết bằng php. Cả hai đều sử dụng mysql_real_escape_string() (nằm ngoài thư viện máy khách mysql chính thức). Bạn phải thoát khỏi đầu vào tại một số điểm, không có cách nào khác. – rook

+2

@ The Rook: Đo từ http://svn.php.net/viewvc/php/php-src/trunk/ext/pdo_mysql/mysql_statement.c?revision=299574&view=markup nó có thể phụ thuộc vào trình điều khiển phụ trợ. Các mysqlnd mới chắc chắn sử dụng statments chuẩn bị thực sự, trong khi cũ hơn có thể rơi trở lại trên PDO_ATTR_EMULATE_PREPARES và thoát/nối. Sau khi tất cả, nó là một trong những tính năng được quảng cáo của PDO để mô phỏng nó ** nếu ** không có sẵn. – mario

1

Bạn không phải lo lắng về điều đó. PDO không yêu cầu bạn phải thoát khỏi dữ liệu của bạn trước khi chuyển nó sang cơ sở dữ liệu.

Chỉnh sửa: Chỉ cần nói rõ, miễn là bạn chuyển biến vào tham số của mình (ví dụ, giá trị của trường biểu mẫu), bạn không phải lo lắng về nó. Tuy nhiên, nếu bạn đang truyền các biến mà bạn đã định nghĩa là chuỗi, thì rõ ràng bạn cần phải thoát khỏi bất kỳ thứ gì cần thoát trong chuỗi đó để tránh cú pháp phá vỡ. Tuy nhiên, điều này thậm chí sẽ không có ý nghĩa nhiều vì một trong những ưu điểm chính của PDO là bạn chuyển thông tin từ người dùng tới cơ sở dữ liệu mà không phải tự vệ sinh nó, và không có nhiều lần (nếu có?) rằng bạn sẽ đi qua các chuỗi mà chính bạn đã xác định.

Ngoài ra, hãy đảm bảo bạn vẫn vệ sinh dữ liệu của mình cho loại. Ví dụ, hãy chắc chắn nó là một số nguyên nếu bạn mong đợi nó sẽ, chắc chắn rằng nó nhỏ hơn hoặc lớn hơn x nếu bạn mong đợi nó sẽ vv

+0

Ok mát mẻ .... vì vậy tất cả các nhân vật đặc biệt nên được đưa về chăm sóc? Giống như thẻ HTML, dấu ngoặc kép ... vv .. – Metropolis

+0

Giả sử rằng bạn đang ràng buộc các tham số của mình vào câu lệnh đã chuẩn bị, vâng. (Rõ ràng nếu bạn đang viết văn bản cho mình trong mã PHP, ví dụ như thành một biến, thì nó cần phải được thoát để không làm gián đoạn cú pháp.) –

+2

Thẻ @Metropolis html không liên quan gì đến SQL, và trích dẫn không quan trọng đối với sự ràng buộc, vì không có dấu trích dẫn xung quanh - vì vậy, không có gì để trốn thoát. –

7

Có và không:

  • Literals mà bạn nhúng vào chuỗi tuyên bố cần phải được thoát như bình thường.
  • Giá trị mà bạn ràng buộc với tuyên bố đã chuẩn bị được thư viện xử lý.
+0

Phải, có nghĩa là – Metropolis

+0

vì vậy nếu tôi sử dụng phương pháp bindParm tôi không cần phải thoát khỏi bất cứ điều gì để ngăn chặn tiêm, phải không? – Patareco

+1

@Patareco Các giá trị được chuyển đến 'PDOStatement :: bindValue()' hoặc 'PDOStatement :: bindParam()' (có một sự khác biệt quan trọng!) Nên được PDO xử lý đúng cách. Bạn không nên trốn thoát chúng, hoặc chúng sẽ được lưu trữ trong cơ sở dữ liệu. Tôi không đảm bảo, mặc dù; có thể có lỗi trong PDO/PHP/MySQL cho phép tiêm. Bạn cũng phải xử lý đầu ra một cách chính xác để ngăn chặn việc chèn tập lệnh. –

3

Nếu bạn chuẩn bị tuyên bố và sử dụng bindParam hoặc bindValue để cung cấp các biến, bạn không cần phải thoát khỏi các biến. Lưu ý rằng các hàm này giả định rằng biến chứa một chuỗi, vì vậy hãy sử dụng tham số thứ ba để bindValue nếu bạn muốn sử dụng các boolean hoặc float.

+0

Im sử dụng chuẩn bị và thực hiện ..... Tôi không sử dụng hàm bindParam hoặc bindValue. – Metropolis

+1

@Metropolis: Được rồi. Nếu bạn vượt qua dấu hỏi? hoặc: các tham số được đặt tên làm đối số cho -> execute(), nó có cùng tác dụng như bindParam. Chỉ cần chăm sóc rằng những nên tham khảo cột văn bản sau đó. – mario

6

Rất ít người dân ở đây hiểu thoát là gì và khi nào sử dụng nó.
Tự thoát không làm cho bất kỳ dữ liệu nào "an toàn". nó chỉ thoát khỏi các dấu phân tách, để phân biệt một dấu phân cách từ một phần dữ liệu. field = 'it's me' sẽ gây ra lỗi, trong khi field = 'it\'s me' sẽ không xảy ra. Đó là mục đích duy nhất để trốn thoát. Vì vậy, nó chỉ hoạt động khi bạn sử dụng dấu ngoặc kép. Nếu bạn không - trốn thoát trở nên vô dụng.

Bạn có sử dụng dấu ngoặc kép với trình giữ chỗ không? Vì vậy, không có lối thoát nào là hợp lý.

Khi bạn sử dụng tính năng ràng buộc, nó hoạt động theo cách rất khác.
Nó không gửi toàn bộ truy vấn đến máy chủ, nhưng gửi truy vấn đã chuẩn bị của bạn riêng biệt với dữ liệu được liên kết. Vì vậy, nó không thể can thiệp. Và do đó không tiêm được.

+0

Câu trả lời rất hoàn hảo và đúng. Đặc biệt đoạn cuối. –

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