Suntikan MySQL dan SQL
MySQL dan SQL Injection
Jika anda mendapat data yang dimasukkan pengguna melalui halaman web dan memasukkannya ke dalam pangkalan data MySQL, maka isu keselamatan suntikan SQL mungkin berlaku.
Bab ini akan memperkenalkan cara mencegah suntikan SQL dan menggunakan skrip untuk menapis aksara yang disuntik dalam SQL.
Apa yang dipanggil suntikan SQL adalah untuk memasukkan arahan SQL ke dalam penyerahan borang Web atau memasukkan nama domain atau rentetan pertanyaan untuk permintaan halaman, akhirnya menipu pelayan untuk melaksanakan perintah SQL yang berniat jahat.
Kita tidak sepatutnya mempercayai input pengguna. Kita mesti menganggap bahawa data yang dimasukkan oleh pengguna tidak selamat. Kita semua perlu menapis data yang dimasukkan oleh pengguna.
Dalam contoh berikut, nama pengguna yang dimasukkan mestilah gabungan huruf, nombor dan garis bawah, dan nama pengguna mestilah antara 8 dan 20 aksara panjangnya:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysql_query("SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }Jom lihat Situasi SQL berikut berlaku apabila aksara khas tidak ditapis:
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysql_query("SELECT * FROM users WHERE name='{$name}'");Dalam pernyataan suntikan di atas, kami tidak menapis pembolehubah $name, dan dimasukkan ke dalam $name yang kami lakukan tidak perlu Pernyataan SQL akan memadam semua data dalam jadual pengguna.
Mysql_query() dalam PHP tidak membenarkan pelaksanaan berbilang pernyataan SQL, tetapi dalam SQLite dan PostgreSQL, berbilang pernyataan SQL boleh dilaksanakan pada masa yang sama, jadi kami perlu memproses data ini pengguna.
Untuk mengelakkan suntikan SQL, kita perlu memberi perhatian kepada perkara berikut:
1. Untuk mengesahkan input pengguna, anda boleh menggunakan ungkapan biasa atau mengehadkan panjang untuk petikan tunggal dan Gandakan "-" untuk penukaran, dsb.
2. Jangan sekali-kali menggunakan himpunan dinamik sql Anda boleh menggunakan sql berparameter atau terus menggunakan prosedur tersimpan untuk pertanyaan dan akses data.
3. Jangan gunakan sambungan pangkalan data dengan keistimewaan pentadbir.
4. Jangan simpan maklumat sulit secara langsung, enkripsi atau cincang kata laluan dan maklumat sensitif.
5 Maklumat pengecualian aplikasi harus memberikan sedikit petunjuk yang mungkin. 🎜>6. Kaedah pengesanan suntikan SQL biasanya menggunakan perisian tambahan atau platform tapak web untuk mengesan perisian ini secara amnya menggunakan alat pengesanan suntikan SQL jsky, dan platform tapak web mempunyai alat pengesan platform keselamatan laman web Yisi. MDCOFT SCAN dsb. Menggunakan MDCOFT-IPS boleh bertahan dengan berkesan terhadap suntikan SQL, serangan XSS, dsb.
Halang suntikan SQL
Dalam bahasa skrip, seperti Perl dan PHP, anda boleh melarikan diri dari data yang dimasukkan pengguna untuk menghalang suntikan SQL.
Pelanjutan MySQL PHP menyediakan fungsi mysql_real_escape_string() untuk melepaskan aksara input khas.
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM users WHERE name='{$name}'")
Suntikan dalam pernyataan Suka
Apabila menanyakan suka, jika nilai yang dimasukkan oleh pengguna termasuk "_" dan "%", keadaan ini akan berlaku: pengguna pada asalnya hanya ingin bertanya "abcd_" , dan hasil pertanyaan Walau bagaimanapun, terdapat masalah "abcd_", "abcde", "abcdf", dll.;
Dalam skrip PHP kita boleh menggunakan fungsi addcslashes() untuk mengendalikan situasi di atas, seperti yang ditunjukkan dalam contoh berikut:
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_"); // $sub == \%something\_ mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");addcslashes() menambah garis miring ke belakang sebelum aksara yang ditentukan .
Format tatabahasa:
addcslashes(string,characters)
参数 | 描述 |
---|---|
string | 必需。规定要检查的字符串。 |
characters | 可选。规定受 addcslashes() 影响的字符或字符范围。 |
Tutorial video berkaitan yang disyorkan: tutorial mysql