Batasan mysql_real_escape_string
Fungsi mysql_real_escape_string dalam PHP telah dikritik kerana tidak memberikan perlindungan menyeluruh terhadap serangan suntikan SQL, menimbulkan persoalan tentang potensinya kekurangan. Walaupun sesetengah pihak berpendapat bahawa penggunaan fungsi yang tidak betul adalah untuk dipersalahkan, yang lain telah menimbulkan kebimbangan tentang batasan yang wujud.
Sekatan Penggunaan
Salah satu masalah utama dengan mysql_real_escape_string ialah ia mesti digunakan dengan tepat seperti yang dimaksudkan. Ia direka bentuk untuk melepaskan nilai teks yang dimaksudkan untuk digunakan dalam petikan tunggal dalam pernyataan SQL, seperti yang dilihat di bawah:
$value = mysql_real_escape_string($value, $link); $sql = "... `foo` = '$value' ...";
Menggunakan mysql_real_escape_string dalam mana-mana konteks lain, seperti apabila menggunakannya untuk melepaskan nilai yang digunakan di luar petikan, boleh membawa kepada kelemahan.
Contoh Mengelak mysql_real_escape_string
Contoh serangan yang boleh memintas mysql_real_escape_string timbul apabila ia digunakan untuk melepaskan nilai berangka. Pertimbangkan pertanyaan berikut:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
Jika input ialah "5 ATAU 1=1", pertanyaannya ialah:
DELETE FROM users WHERE user_id = 5 OR 1=1
Pertanyaan ini akan memadamkan semua pengguna, sebagai " ATAU syarat 1=1" sentiasa benar. Serangan ini menunjukkan kepentingan menggunakan jenis data yang betul dan kaedah melarikan diri bergantung pada konteks.
Pengendalian Pengekodan yang Salah
Satu lagi kemungkinan perangkap dengan mysql_real_escape_string berkaitan dengan aksara pengekodan. Jika pengekodan sambungan pangkalan data tidak ditetapkan dengan betul, ia boleh menyebabkan ketidakkonsistenan antara cara mysql_real_escape_string melepaskan rentetan dan cara pangkalan data mentafsirnya. Percanggahan ini boleh mewujudkan kelemahan dalam keadaan tertentu, terutamanya apabila berurusan dengan rentetan berbilangbait.
Kesimpulan
Walaupun mysql_real_escape_string boleh menjadi alat yang berkesan apabila digunakan dengan betul, batasannya dan risiko salah guna menjadikannya pilihan yang kurang dipercayai untuk mencegah serangan suntikan SQL. Adalah dinasihatkan untuk menggunakan pendekatan alternatif seperti pernyataan yang disediakan, pertanyaan berparameter atau lebih banyak API pangkalan data moden yang memberikan perlindungan yang lebih teguh terhadap kelemahan suntikan.
Atas ialah kandungan terperinci Adakah mysql_real_escape_string Benar-benar Selamat Terhadap Serangan Suntikan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!