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

Perbedaan antara real_escape_string dan prepare()?

Melarikan diri sama efektifnya dengan pertahanan injeksi SQL seperti menggunakan parameter kueri.

Kedua cara tersebut juga kurang efektif jika Anda gagal melakukannya secara konsisten.

Kedua metode hanya berguna untuk melindungi nilai individu dalam ekspresi SQL. Mereka tidak mendukung bagian dinamis lainnya dari kueri. Misalnya, jika Anda ingin ORDER BY kolom yang ditentukan pengguna. Baik parameter kueri maupun fungsi escaping tidak menanganinya.

Jadi pada dasarnya, ini adalah masalah gaya dan preferensi pribadi.

Saya lebih suka parameter kueri karena menurut saya ini:

$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);

Lebih jelas dari ini:

$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);

Anda tidak dapat dengan serius mengatakan bahwa mengutak-atik semua tanda kutip terbuka/tutup dan . penggabungan string lebih mudah daripada menggunakan prepare() dengan parameter kueri.

Kembali komentar Anda tentang query() hipotetis fungsi dengan parameter.

Pertama-tama, itu tidak perlu. Menggunakan prepare() dan execute() bersama-sama adalah harga kecil yang harus dibayar untuk menulis kode aman, dan dengan bersikeras melakukannya dengan satu fungsi, Anda terdengar malas. Saya kira Anda tidak memeriksa nilai kembalian fungsi yang mengembalikan false salah juga?

Untuk apa nilainya, akan mudah untuk menulis fungsi pembungkus untuk melakukan keduanya, karena PHP mendukung varargs secara implisit.

function myquery() {
  global $pdo;
  $params = func_get_args();
  $sql = array_shift($params);
  $stmt = $pdo->prepare($sql);
  $stmt->execute($params);
  return $stmt; // so we can fetch(), etc.
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Persimpangan rentang tanggal dalam SQL

  2. bantuan kueri mysql untuk tampilan hierarki

  3. database kategori fungsi rekursif

  4. Konfigurasi SSL khusus lingkungan di file .env Laravel

  5. Bagaimana cara menghindari karakter kutipan di MySQL dan Java