Kerentanan dalam Penggunaan mysql_real_escape_string
Walaupun ramai telah membangkitkan kebimbangan mengenai potensi risiko menggunakan mysql_real_escape_string untuk melindungi daripada serangan suntikan SQL, sedikit memberikan contoh konkrit yang menggambarkan batasannya. Untuk menangani perkara ini, mari kita selidiki kelemahan utama fungsi ini.
Penggunaan Salah
Satu perangkap biasa dalam menggunakan mysql_real_escape_string ialah salah pengendalian nilai berangka. Pertimbangkan kod berikut:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
Di sini, input '5 OR 1=1' akan mengelak daripada perlindungan kerana mysql_real_escape_string direka untuk pembersihan rentetan, bukan nilai angka.
Konteks -Had Khusus
Satu lagi had mysql_real_escape_string terletak pada konteks penggunaan khususnya. Ia bertujuan untuk melepaskan nilai dalam rentetan yang disebut dalam pernyataan SQL, bukan untuk konteks lain seperti nilai yang tidak disebut atau secara langsung dalam sintaks SQL.
Sebagai contoh, kod berikut akan terdedah:
mysql_query("... `foo` = $value ...");
Seperti yang dibincangkan di atas, mysql_real_escape_string tidak akan digunakan dengan betul dalam senario ini.
Isu Pengekodan
Selain itu, tetapan pengekodan sambungan pangkalan data yang salah boleh membawa kepada kerentanan. Jika pengekodan sambungan ditetapkan menggunakan mysql_query("SET NAMES 'utf8'"), dan bukannya mysql_set_charset('utf8'), mysql_real_escape_string akan menganggap pengekodan aksara yang salah dan rentetan melarikan diri secara tidak sesuai. Ini boleh memudahkan serangan suntikan yang melibatkan rentetan berbilangbait.
Kesimpulan
Walaupun mysql_real_escape_string tidak mempunyai kelemahan yang wujud apabila digunakan dengan betul, kebimbangan utama terletak pada kecenderungannya terhadap penggunaan yang salah. Had yang dibincangkan di atas menggambarkan cabaran dalam menggunakan fungsi ini dengan berkesan, menjadikannya penting untuk mempertimbangkan pendekatan alternatif seperti pernyataan yang disediakan atau pertanyaan berparameter untuk memastikan perlindungan yang teguh terhadap serangan suntikan SQL.
Atas ialah kandungan terperinci Adakah `mysql_real_escape_string` Benar-benar Selamat? Memeriksa Had Fungsi.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!