Adakah mysqli_real_escape_string Mencukupi untuk Mengurangkan Suntikan dan Serangan SQL?
Walaupun penggunaannya meluas, mysqli_real_escape_string bukanlah pertahanan yang tidak dapat ditembusi oleh SQL injection. Seperti yang digambarkan dalam contoh yang disediakan:
$email = mysqli_real_escape_string($db_con, $_POST['email']); $psw = mysqli_real_escape_string($db_con, $_POST['psw']); $query = "INSERT INTO `users` (`email`, `psw`) VALUES ('$email', '$psw')";
Kod ini cuba melindungi daripada input berniat jahat dengan melepaskan petikan tunggal menggunakan mysqli_real_escape_string. Walau bagaimanapun, pendekatan ini kekal terdedah kepada suntikan SQL, seperti yang ditunjukkan oleh serangan ini:
myEmail = 'user@example.com' OR 0 = 1
Dalam keadaan ini, suntikan mengeksploitasi fakta bahawa mysqli_real_escape_string hanya melepaskan petikan tunggal. Dengan menyuntik rentetan myEmail = 'user@example.com' ATAU 0 = 1 ke dalam medan e-mel, penyerang boleh memintas pengesahan dan mendapat akses tanpa kebenaran.
Untuk mencegah suntikan SQL dengan berkesan, pertimbangkan untuk menggunakan pernyataan yang disediakan atau berparameter pertanyaan. Mekanisme ini memisahkan data daripada arahan dengan teliti, menghapuskan kemungkinan pencemaran input.
Pernyataan yang disediakan melaksanakan pertanyaan dengan parameter yang dibekalkan pengguna. Nilai ini dimasukkan dengan selamat ke dalam pertanyaan tanpa mengubah strukturnya. Contohnya:
$stmt = $mysqli->prepare("INSERT INTO `users` (`email`, `psw`) VALUES (?, ?)"); $stmt->bind_param("ss", $email, $psw);
Dalam situasi di mana kenyataan yang disediakan tidak boleh dilaksanakan, laksanakan senarai putih yang ketat untuk menyekat input yang dibenarkan. Ini memastikan bahawa hanya nilai selamat diproses.
Kesimpulannya, walaupun mysqli_real_escape_string menyediakan sedikit perlindungan terhadap suntikan SQL, ia tidak mudah. Kenyataan yang disediakan atau pertanyaan berparameter bersama-sama dengan penyenaraian putih menawarkan mekanisme pertahanan yang lebih teguh terhadap serangan ini.
Atas ialah kandungan terperinci Adakah `mysqli_real_escape_string` Cukup untuk Mencegah Suntikan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!