Fungsi mysql_real_escape_string, bertujuan untuk melindungi daripada serangan suntikan SQL, telah diteliti untuk hadnya. Walaupun ia boleh meningkatkan keselamatan, kelemahan tertentu menghalang keberkesanannya.
Penggunaan Salah dan Nilai Angka
Satu isu utama ialah penggunaan mysql_real_escape_string yang salah. Ia direka bentuk semata-mata untuk melepaskan nilai rentetan dalam pertanyaan SQL. Walau bagaimanapun, jika digunakan pada nilai berangka, seperti dalam contoh:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
ia gagal menghalang serangan seperti:
5 OR 1=1
Sisipan Rentetan Tidak Dipetik
Satu lagi kelemahan timbul apabila mysql_real_escape_string digunakan dalam perkara berikut senario:
$sql = "... `foo` = $value ...";
Di sini, input dimasukkan tanpa melarikan diri dan petikan yang betul, membenarkan serangan suntikan SQL. Begitu juga, jika digunakan pada pembolehubah, seperti:
$sql = "... `$value` ...";
kelemahan berterusan.
Konflik Pengekodan Sambungan Pangkalan Data
Selain itu, ketidakkonsistenan antara pengekodan ditetapkan dalam mysql_ API dan pangkalan data boleh mencipta kelemahan. Menetapkan pengekodan pangkalan data menggunakan kaedah yang salah, seperti:
mysql_query("SET NAMES 'utf8'", $link);
boleh menyebabkan ketidakpadanan dalam rentetan melarikan diri, yang membawa kepada kemungkinan serangan suntikan.
Kesimpulan
Walaupun mysql_real_escape_string boleh memberikan sedikit perlindungan terhadap serangan suntikan SQL, kes penggunaannya yang sempit dan kerentanan terhadap aplikasi yang salah menjadikannya pilihan yang kurang diingini. Untuk keselamatan yang lebih teguh, pembangun digalakkan untuk meneroka kaedah alternatif, seperti pernyataan yang disediakan, yang menawarkan perlindungan yang lebih besar terhadap kelemahan.
Atas ialah kandungan terperinci Adakah mysql_real_escape_string Benar-benar Berkesan Melawan Suntikan SQL, dan Apakah Hadnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!