2011-12-05 41 views
6

Tôi đọc mà với PDO bạn không cần phải thoát khỏi các biến nếu bạn sử dụng chuẩn bị và thông qua các biến trong thực hiện:Tôi có cần phải thoát khỏi đầu vào DB không?

$st = $dbh->prepare("INSERT INTO mytable (name,email) VALUES (?,?)"); 
$st->execute(array($_POST['name'], $_POST['email'])); 

là trù này?

Hoặc tôi vẫn cần làm điều gì đó với $ _POST ở đó?

+1

Mặc dù không cần thoát, hãy đảm bảo kiểm tra các giá trị đầu vào cho độ chính xác, phạm vi chấp nhận được, email được định dạng đúng, v.v ... và trả lại thông báo lỗi cho người dùng của bạn khi thích hợp. –

+0

vâng, tôi chỉ tò mò về các cuộc tấn công sql – JohnSmith

+0

Miễn là bạn nghiêm ngặt về những gì bạn đặt vào truy vấn của bạn và nơi bạn làm điều đó (tức là sử dụng tham số mọi lúc, không bao giờ * bao giờ * cho phép dữ liệu do người dùng cung cấp bị rò rỉ vào các phần ghép nối của các truy vấn động) thì bạn sẽ an toàn. – Polynomial

Trả lời

5

Trên các câu lệnh đã chuẩn bị, không cần phải thoát (và thoát khỏi những thứ sẽ dẫn đến thoát kép, khiến dữ liệu thoát được ghi vào DB). Tuy nhiên, các câu lệnh chuẩn bị PDO KHÔNG THỂ xử lý tất cả các biến thể truy vấn và đôi khi bạn sẽ phải chèn dữ liệu "nước ngoài" trực tiếp vào một chuỗi truy vấn, điều đó có nghĩa là bạn sẽ chịu trách nhiệm thoát nó một cách chính xác. Đặc biệt, các truy vấn động nơi thay đổi tên bảng và/hoặc trường không thể được chỉ định bằng cách sử dụng câu lệnh đã chuẩn bị. ví dụ.

SELECT ? FROM ? WHERE ?=? 

không thể thực hiện được. Chỉ các giá trị có thể được chỉ định với trình giữ chỗ.

+0

chọn? ở đâu? = dường như không hoạt động. Rõ ràng chỉ có giá trị có thể có? ... – JohnSmith

+0

Chính xác. không thể chỉ định tên trường và bảng bằng trình giữ chỗ. –

2

Câu trả lời ngắn gọn: Không, bạn không cần phải thoát khỏi bất kỳ điều gì. Các truy vấn được tham số hóa là hoàn toàn tuyệt vời! :)

Câu trả lời dài: Không, bạn không cần phải thoát khỏi bất cứ điều gì khi nó đi vào cơ sở dữ liệu. Tuy nhiên, bạn vẫn nên sử dụng htmlspecialchars khi hiển thị đầu ra cơ sở dữ liệu từ truy vấn để ngăn chặn các cuộc tấn công XSS, nếu không bạn sẽ kết thúc với một người nào đó nhồi nhét như thế này trong một trường tùy ý:

<script type="text/javascript">alert('sup, I'm in ur site!');</script>.

+1

Nhấn mạnh * khi hiển thị đầu ra cơ sở dữ liệu *. Bạn nên nói chung ** không ** lưu trữ HTML trong cơ sở dữ liệu trừ khi trường của bạn thực sự là HTML. – phihag

2

Điều này đúng; mã đúng (mặc dù bạn có thể muốn xử lý trường hợp $_POST['name'] không được đặt).

Chức năng tuyên bố đã chuẩn bị của PDO bàn giao các giá trị ở định dạng không cần thoát rõ ràng.

+1

Điều quan trọng cần lưu ý là PDO không thực sự thực hiện bất kỳ thao tác thoát nào, nó chỉ tách biệt hoàn toàn dữ liệu khỏi ngôn ngữ truy vấn. – Polynomial

+0

@Polynomial Cảm ơn, đã cập nhật. – phihag

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