Không, không có!
Về mặt kỹ thuật, có PDO::quote()
nhưng nó hiếm khi được sử dụng và không tương đương với mysql_real_escape_string()
Đúng vậy! Nếu bạn đang sử dụng PDO theo cách thích hợp như được ghi lại bằng cách sử dụng câu lệnh chuẩn bị sẵn , sau đó nó sẽ bảo vệ bạn khỏi việc tiêm MySQL.
# Example:
Dưới đây là ví dụ về két sắt truy vấn cơ sở dữ liệu bằng cách sử dụng các câu lệnh chuẩn bị (pdo)
try {
// first connect to database with the PDO object.
$db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
} catch(\PDOException $e){
// if connection fails, show PDO error.
echo "Error connecting to mysql: " . $e->getMessage();
}
Và, bây giờ giả sử kết nối được thiết lập, bạn có thể thực hiện truy vấn của mình như thế này.
if($_POST && isset($_POST['color'])){
// preparing a statement
$stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");
// execute/run the statement.
$stmt->execute(array($_POST['color']));
// fetch the result.
$cars = $stmt->fetchAll(\PDO::FETCH_ASSOC);
var_dump($cars);
}
Bây giờ, như bạn có thể nói, tôi chưa sử dụng bất kỳ thứ gì để thoát / khử trùng giá trị của $_POST["color"]
. Và mã này được bảo mật khỏi myql-injection nhờ PDO và sức mạnh của các câu lệnh đã chuẩn bị.
Cần lưu ý rằng bạn nên chuyển một charset=utf8
dưới dạng thuộc tính, trong DSN
của bạn như đã thấy ở trên, vì lý do bảo mật và luôn cho phépPDO hiển thị lỗi ở dạng ngoại lệ.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
vì vậy lỗi từ các truy vấn cơ sở dữ liệu của bạn sẽ không tiết lộ dữ liệu nhạy cảm như cấu trúc thư mục, tên người dùng cơ sở dữ liệu, v.v.
Cuối cùng nhưng không kém phần quan trọng, có những thời điểm bạn không nên tin tưởng 100% vào PDO và sẽ phải thực hiện một số biện pháp bổ sung để ngăn chặn việc tiêm sql, một trong những trường hợp đó là, nếu bạn đang sử dụng phiên bản lỗi thời của mysql [ mysql =< 5.3.6 ]
như được mô tả trong câu trả lời này
Tuy nhiên, sử dụng các câu lệnh đã chuẩn bị sẵn như được hiển thị ở trên sẽ luôn an toàn hơn so với việc sử dụng bất kỳ hàm nào bắt đầu bằng mysql_
Những bài đọc hay