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

Kekurangan mysql_real_escape_string?

Kekurangan utama mysql_real_escape_string , atau ekstensi mysql_ secara umum, lebih sulit untuk diterapkan dengan benar daripada API lain yang lebih modern, terutama pernyataan yang disiapkan. mysql_real_escape_string seharusnya digunakan tepat dalam satu kasus:keluar dari konten teks yang digunakan sebagai nilai dalam pernyataan SQL di antara tanda kutip. Mis.:

$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
                     ^^^^^^

mysql_real_escape_string memastikan bahwa $value dalam konteks di atas tidak mengacaukan sintaks SQL. Ini tidak bekerja seperti yang Anda pikirkan di sini:

$sql = "... `foo` = $value ...";

atau di sini:

$sql = "... `$value` ...";

atau di sini:

$sql = mysql_real_escape_string("... `foo` = '$value' ...");

Jika diterapkan ke nilai yang digunakan dalam konteks apa pun selain string yang dikutip dalam pernyataan SQL, itu salah diterapkan dan mungkin atau mungkin tidak mengacaukan sintaks yang dihasilkan dan/atau mengizinkan seseorang untuk mengirimkan nilai yang dapat mengaktifkan serangan injeksi SQL. Kasus penggunaan mysql_real_escape_string sangat sempit, tetapi jarang dipahami dengan benar.

Cara lain untuk masuk ke air panas menggunakan mysql_real_escape_string adalah ketika Anda mengatur penyandian koneksi database menggunakan metode yang salah. Anda harus melakukan ini:

mysql_set_charset('utf8', $link);

Anda bisa juga lakukan ini:

mysql_query("SET NAMES 'utf8'", $link);

Masalahnya adalah yang terakhir melewati mysql_ API, yang masih menganggap Anda sedang berbicara dengan database menggunakan latin1 (atau sesuatu yang lain). Saat menggunakan mysql_real_escape_string sekarang, ia akan menganggap pengkodean karakter yang salah dan melepaskan string secara berbeda dari yang akan ditafsirkan oleh database nanti. Dengan menjalankan SET NAMES query, Anda telah membuat celah antara bagaimana mysql_ client API memperlakukan string dan bagaimana database akan menafsirkan string ini. Ini dapat digunakan untuk serangan injeksi dalam situasi string multibyte tertentu.

Tidak ada kerentanan injeksi mendasar di mysql_real_escape_string yang saya ketahui jika diterapkan dengan benar. Sekali lagi, masalah utamanya adalah sangat mudah untuk menerapkannya secara tidak benar, yang membuka kerentanan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 Cara Menemukan Baris yang Mengandung Huruf Kecil di MySQL

  2. NULL di MySQL (Kinerja &Penyimpanan)

  3. Manajemen akun pengguna, peran, izin, otentikasi PHP dan MySQL - Bagian 4

  4. Campuran ilegal dari collation Kesalahan MySQL

  5. Bagaimana cara mengubah string menjadi tanggal di MySQL?