Adakah MySql_real_escape_string() dan mysql_escape_string() Mencukupi untuk Keselamatan Apl? Menilai Kerentanan Berpotensi
Walaupun penggunaannya yang biasa, mysql_real_escape_string() dan mysql_escape_string() mungkin tidak melindungi sepenuhnya pangkalan data daripada serangan SQL, menjadikannya terdedah kepada pelbagai eksploitasi berniat jahat.
>>
Bertentangan dengan kepercayaan popular, mysql_real_escape_string() tidak boleh menghalang suntikan SQL dalam semua senario. Ia secara berkesan melepaskan data pembolehubah tetapi gagal melindungi nama jadual, nama lajur atau LIMIT medan daripada manipulasi berniat jahat. Had ini boleh dieksploitasi oleh penyerang untuk mencipta pertanyaan seperti berikut:$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
LIKE SQL Attacks
LIKE SQL attacks juga boleh memintas mysql_real_escape_string() perlindungan. Pertanyaan yang melibatkan penyataan SEPERTI "$data%", penyerang boleh memberikan rentetan kosong sebagai input untuk memadankan semua rekod, yang berpotensi mendedahkan maklumat sensitif seperti nombor kad kredit.Eksploitasi Charset
Eksploitasi charset kekal sebagai ancaman, terutamanya dalam Internet Explorer. Dengan mengeksploitasi perbezaan set aksara antara pangkalan data dan penyemak imbas web, penyerang boleh melaksanakan pertanyaan berniat jahat yang mendapat kawalan penuh ke atas pelayan SQL.Eksploitasi LIMIT
Eksploitasi LIMIT membenarkan penyerang untuk memanipulasi klausa LIMIT bagi pertanyaan SQL, menggunakannya untuk menyertai berbilang pertanyaan dan melaksanakan tanpa kebenaran arahan.Pernyataan Disediakan sebagai Pertahanan Teguh
Untuk memerangi kelemahan ini dan memastikan keselamatan aplikasi yang berkesan, kenyataan yang disediakan muncul sebagai mekanisme pertahanan pilihan. Penyata yang disediakan menggunakan pengesahan sisi pelayan untuk melaksanakan hanya pernyataan SQL yang dibenarkan, memberikan pertahanan proaktif terhadap kedua-dua eksploitasi yang diketahui dan tidak diketahui.Contoh Kod Menggunakan Penyata Disediakan
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.stackoverflow.com/'; $limit = 1; $validColumns = array('url', 'last_fetched'); // Validate the $column parameter if (!in_array($column, $validColumns)) { $column = 'id'; } $statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value)); while (($data = $statement->fetch())) { }
Kesimpulan
Sementara mysql_real_escape_string() dan mysql_escape_string() menyediakan beberapa perlindungan terhadap serangan SQL, ia tidak mudah. Melaksanakan kenyataan yang disediakan ialah penyelesaian yang lebih komprehensif dan teguh yang melindungi aplikasi daripada pelbagai kelemahan, memastikan keselamatan apl yang lebih baik.Atas ialah kandungan terperinci Adakah `mysql_real_escape_string()` dan `mysql_escape_string()` Cukup untuk Melindungi Apl Saya daripada SQL Injection?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!