Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apa yang setara dengan PDO dari fungsi mysql_real_escape_string?

Tidak, tidak ada!

Secara teknis ada PDO::quote() tetapi jarang digunakan dan tidak setara dengan mysql_real_escape_string()

Benar! Jika Anda sudah menggunakan PDO dengan cara yang benar seperti yang didokumentasikan menggunakan pernyataan yang disiapkan , maka itu akan melindungi Anda dari injeksi MySQL.

# Example:

Di bawah ini adalah contoh aman kueri basis data menggunakan pernyataan yang disiapkan (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();
 }

Dan, sekarang dengan asumsi koneksi dibuat, Anda dapat menjalankan kueri Anda seperti ini.

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); 
 }

Sekarang, seperti yang mungkin Anda ketahui, saya belum pernah menggunakan apa pun untuk melarikan diri/membersihkan nilai $_POST["color"] . Dan kode ini aman dari injeksi myql berkat PDO dan kekuatan pernyataan yang disiapkan.

Perlu dicatat bahwa Anda harus memberikan charset=utf8 sebagai atribut, di DSN . Anda seperti yang terlihat di atas, untuk alasan keamanan, dan selalu aktifkan PDO untuk menampilkan kesalahan dalam bentuk pengecualian.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

jadi kesalahan dari kueri basis data Anda tidak akan mengungkapkan data sensitif seperti struktur direktori Anda, nama pengguna basis data, dll.

Last but not least, ada saat-saat ketika Anda seharusnya tidak mempercayai PDO 100%, dan akan terikat untuk mengambil beberapa tindakan ekstra untuk mencegah injeksi sql, salah satunya adalah, jika Anda menggunakan versi lama dari mysql [ mysql =< 5.3.6 ] seperti yang dijelaskan dalam jawaban ini

Namun, menggunakan pernyataan siap seperti yang ditunjukkan di atas akan selalu lebih aman, daripada menggunakan salah satu fungsi yang dimulai dengan mysql_

Selamat membaca

Tutorial PDO untuk Pengembang 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. MySQL DATEDIFF() vs TIMESTAMPDIFF():Apa Bedanya?

  2. Mendapatkan jumlah baris sisipan/perbarui dari ON DUPLICATE KEY UPDATE

  3. Apakah ext PDO PHP7 membaca seluruh hasil yang disetel ke dalam memori?

  4. Bagaimana menemukan data yang tidak ada dari Tabel lain dengan BERGABUNG?

  5. Memastikan koneksi MySQL berfungsi dalam fungsi PHP