Adakah mysql_real_escape_string() dan mysql_escape_string() Mencukupi untuk Keselamatan Apl?
Walaupun fungsi ini boleh memberikan sedikit perlindungan terhadap suntikan SQL dan serangan lain , mereka gagal menangani perkara tertentu kelemahan.
SQL Injection
Mysql_real_escape_string() masih boleh mendedahkan aplikasi anda kepada suntikan SQL jika anda mengendalikan pembolehubah PHP secara tidak wajar dalam pertanyaan. Pertimbangkan contoh berikut:
$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
Pertanyaan ini boleh dimanipulasi oleh penyerang untuk melaksanakan pernyataan SQL yang tidak dibenarkan, kerana mysql_real_escape_string() tidak direka bentuk untuk melindungi nama jadual, nama lajur atau medan LIMIT.
Suka Serangan
Mysql_real_escape_string() tidak mencukupi untuk menghalang eksploitasi LIKE. Penyerang boleh memasukkan nilai hasad seperti "%%" untuk mengembalikan semua rekod, yang berpotensi menjejaskan maklumat sensitif.
Eksploitasi Charset
Pelayar tertentu mungkin terdedah kepada charset eksploitasi, membenarkan penyerang menyuntik watak jahat yang memintas mekanisme melarikan diri dan melaksanakan SQL sewenang-wenangnya arahan.
Pernyataan Disediakan: Penyelesaian Komprehensif
Untuk memastikan permohonan anda dengan berkesan, adalah disyorkan untuk menggunakan pernyataan yang disediakan dan bukannya mysql_real_escape_string(). Penyataan yang disediakan melaksanakan pertanyaan SQL dengan nilai yang dibekalkan pengguna dengan mengikatnya sebagai parameter. Ini menghapuskan keperluan untuk melarikan diri secara manual dan memastikan bahawa hanya SQL yang dibenarkan dilaksanakan.
Berikut ialah contoh penggunaan pernyataan yang disediakan dalam PHP:
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.example.com/'; $limit = 1; // Validate the search parameter column. $validColumns = array('url', 'last_fetched'); 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())) { }
Pernyataan yang disediakan menawarkan mekanisme pertahanan proaktif oleh memanfaatkan ciri keselamatan pelayan pangkalan data asas. Ia sememangnya tahan terhadap serangan yang diketahui dan tidak diketahui, memastikan integriti data anda.
Atas ialah kandungan terperinci Adakah Menggunakan `mysql_real_escape_string()` dan `mysql_escape_string()` Cukup untuk Melindungi Aplikasi Anda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!