Keselamatan MySQL: Adakah mysql_real_escape_string() dan mysql_escape_string() Mencukupi?
Keberkesanan mysql_real_escape_string()_real_escape_string) telah mencetuskan beberapa perdebatan. Walaupun fungsi ini menghalang vektor suntikan SQL yang diketahui, batasannya mungkin menyebabkan anda terdedah kepada serangan yang lebih maju.
Kerentanan Suntikan SQL
Walaupun menggunakan mysql_real_escape_string(), anda boleh masih terdedah kepada suntikan SQL dalam senario di mana pembolehubah PHP disepadukan ke dalam pertanyaan. Sebagai contoh, pertimbangkan kod ini:
<code class="php">$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);</code>
Penggodam yang canggih boleh mengeksploitasi pertanyaan ini dengan input berikut:
<code class="php">$field = "1=1" $value = "1"</code>
Ini memintas logik yang dimaksudkan, mengembalikan (berpotensi) semua rekod sebaliknya daripada yang sepadan dengan kriteria yang ditetapkan.
LIKE Attacks
mysql_real_escape_string() tidak berkesan dalam mencegah serangan LIKE, seperti:
<code class="php">$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " LIKE " . mysql_real_escape_string($value);</code>
A pengguna berniat jahat boleh menetapkan $value kepada % untuk mendapatkan semula semua rekod, yang berpotensi mendedahkan data sensitif.
Eksploitasi Charset
Internet Explorer kekal terdedah kepada eksploitasi charset, walaupun pada tahun 2011. Kerentanan ini boleh memberikan penyerang kawalan ke atas pangkalan data anda, sama seperti suntikan SQL.
Pernyataan Disediakan: Pendekatan Proaktif
Kedua-dua mysql_real_escape_string() dan mysql_escape_string() adalah terdedah kerana terdedah ia adalah mekanisme pertahanan reaktif. Kenyataan yang disediakan, sebaliknya, memberikan penyelesaian yang proaktif. Dengan melaksanakan hanya SQL yang sah dan diprogramkan, pernyataan yang disediakan secara mendadak mengurangkan risiko pelaksanaan SQL yang tidak dijangka, tanpa mengira kelemahan pangkalan data asas.
Berikut ialah contoh menggunakan pernyataan yang disediakan:
<code class="php">$statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value));</code>
Pernyataan yang disediakan adalah selamat dan kurang bertele-tele daripada menggunakan mysql_real_escape_string(). Mereka bergantung pada langkah perlindungan pelayan pangkalan data untuk melindungi daripada ancaman yang diketahui dan tidak diketahui.
Atas ialah kandungan terperinci Adakah mysql_real_escape_string() dan mysql_escape_string() Cukup untuk Melindungi Aplikasi MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!