Bagaimana MySQL mencegah injeksi sql? Prinsip dan pencegahan injeksi SQL

MySQLBagaimana cara mencegah injeksi sql? Prinsip dan pencegahan injeksi SQL

MySQL dan injeksi SQL

Jika Anda mengambil data yang dimasukkan oleh pengguna melalui halaman web dan memasukkannya ke dalam adatabase MySQL, maka mungkin ada masalah keamanan injeksi SQL.

Bab ini akan memperkenalkan cara mencegah injeksi SQL dan memfilter karakter yang disuntikkan dalam SQL melalui skrip.

Yang disebut injeksi SQL adalah untuk menipu server untuk mengeksekusi perintah SQL berbahaya dengan memasukkan perintah SQL ke dalam formulir web untuk mengirimkan atau memasukkan string kueri dari nama domain atau permintaan halaman.

Kita tidak boleh mempercayai input pengguna, kita harus berasumsi bahwa data input pengguna tidak aman, dan kita semua perlu memfilter data input pengguna.

Dalam contoh berikut, nama pengguna yang dimasukkan harus berupa kombinasi huruf, angka, dan garis bawah, dan panjang nama pengguna harus antara 8 dan 20 karakter:

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, "SELECT * FROM users 
                          WHERE username=$matches[0]");
}
 else 
{
   echo "username 输入异常";
}

Mari kita lihat situasi SQL yang terjadi ketika karakter khusus tidak difilter:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Dalam pernyataan injeksi di atas, kami tidak memfilter variabel $name, dan pernyataan SQL yang tidak kami perlukan dimasukkan ke dalam $name, yang akan menghapus semua data di tabel users.

mysqli_query() di PHP tidak diperbolehkan untuk mengeksekusi beberapa pernyataan SQL, tetapi di SQLite dan PostgreSQL, beberapa pernyataan SQL dapat dieksekusi pada saat yang sama, jadi kami perlu memverifikasi data pengguna ini secara ketat.

Untuk mencegah injeksi SQL, kita perlu memperhatikan poin-poin berikut:

  • 1. Jangan pernah mempercayai input pengguna.Periksa input pengguna, Anda dapat menggunakan ekspresi reguler, atau membatasi panjangnya; mengonversi tanda kutip tunggal dan menggandakan "-", dll.
  • 2. Jangan pernah menggunakan sql perakitan dinamis, Anda dapat menggunakan sql berparameter atau langsung menggunakan prosedur tersimpan untuk permintaan dan akses data.
  • 3. Jangan pernah menggunakan koneksi database dengan hak administrator, gunakan koneksi database terpisah dengan hak terbatas untuk setiap aplikasi.
  • 4. Jangan menyimpan informasi rahasia secara langsung, mengenkripsi atau mengeluarkan kata sandi dan informasi sensitif.
  • 5. Informasi pengecualian aplikasi harus memberikan petunjuk sesedikit mungkin, dan yang terbaik adalah menggunakan informasi kesalahan khusus untuk membungkus informasi kesalahan asli
  • 6. Metode deteksi injeksi sql umumnya mengadopsi bantu软件Atau platform situs web untuk mendeteksi, perangkat lunak umumnya menggunakan alat deteksi injeksi sql jsky, dan platform situs web memiliki alat deteksi platform keamanan situs web Yisi. MDCSOFT SCAN dkk.Menggunakan MDCSOFT-IPS dapat secara efektif bertahan terhadap injeksi SQL, serangan XSS, dll.

Mencegah Injeksi SQL

Dalam bahasa scripting seperti Perl dan PHP Anda dapat menghindari data yang dimasukkan oleh pengguna untuk mencegah injeksi SQL.

Ekstensi MySQL untuk PHP menyediakan fungsi mysqli_real_escape_string() untuk menghindari karakter input khusus.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Injeksi dalam Pernyataan Suka

Saat menanyakan seperti, jika pengguna memasukkan nilai dengan "_" dan "%", ini akan terjadi: pengguna awalnya ingin menanyakan "abcd_", tetapi hasil kueri menyertakan "abcd_", "abcde", dan "abcdf " Dll.; masalah juga terjadi saat pengguna ingin menanyakan "30%" (catatan: tiga puluh persen).

Dalam script PHP kita dapat menggunakan fungsi addcslashes() untuk menangani situasi di atas, seperti pada contoh berikut:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

Fungsi addcslashes() menambahkan garis miring terbalik sebelum karakter yang ditentukan.

Format sintaks:

addcslashes(string,characters)
参数描述
taliYg dibutuhkan.Menentukan string untuk diperiksa.
karakterOpsional.Menentukan karakter atau rentang karakter yang dipengaruhi oleh addcslashes().

Harapan Chen Weiliang Blog ( https://www.chenweiliang.com/ ) bersama "Bagaimana cara MySQL mencegah injeksi sql? prinsip dan pencegahan injeksi sql", ini akan membantu Anda.

Selamat datang untuk membagikan tautan artikel ini:https://www.chenweiliang.com/cwl-500.html

Selamat datang di saluran Telegram blog Chen Weiliang untuk mendapatkan pembaruan terkini!

🔔 Jadilah orang pertama yang mendapatkan "Panduan Penggunaan Alat AI Pemasaran Konten ChatGPT" yang berharga di direktori teratas saluran! 🌟
📚 Panduan ini mengandung nilai yang sangat besar, 🌟Ini adalah kesempatan langka, jangan sampai terlewatkan! ⏰⌛💨
Bagikan dan sukai jika Anda suka!
Berbagi dan suka Anda adalah motivasi berkelanjutan kami!

 

发表 评论

Alamat email Anda tidak akan dipublikasikan. 必填 项 已 用 * 标注

滚动 到 顶部