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.