Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tương đương PDO của hàm mysql_real_escape_string là gì?

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

Hướng dẫn PDO cho nhà phát triển MySQL



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. c3p0 maxIdleTime giống như wait_timeout của mysql?

  2. Di chuyển Cơ sở dữ liệu MySQL từ Amazon RDS sang DigitalOcean

  3. Sự cố khi liên kết một mảng đã nổ vào một câu lệnh được chuẩn bị sẵn mysql

  4. Hàm MySQL LEAST () - Tìm đối số nhỏ nhất trong danh sách đối số

  5. Chọn tất cả các trường ngoại trừ chỉ một trường trong mysql