Bagaimanakah MySQL menghalang suntikan sql? Prinsip suntikan SQL dan pencegahan

MySQLBagaimana untuk mengelakkan suntikan sql? Prinsip suntikan SQL dan pencegahan

MySQL dan suntikan SQL

Jika anda mengambil data yang dimasukkan oleh pengguna melalui halaman web dan memasukkannya ke dalam apangkalan data MySQL, maka mungkin terdapat masalah keselamatan suntikan SQL.

Bab ini akan memperkenalkan cara untuk menghalang suntikan SQL dan menapis aksara yang disuntik dalam SQL melalui skrip.

Suntikan SQL yang dipanggil adalah untuk menipu pelayan untuk melaksanakan perintah SQL yang berniat jahat dengan memasukkan arahan SQL ke dalam borang web untuk menyerahkan atau memasukkan rentetan pertanyaan nama domain atau permintaan halaman.

Kita tidak sepatutnya mempercayai input pengguna, kita mesti menganggap bahawa data input pengguna tidak selamat, dan kita semua perlu menapis data input pengguna.

Dalam contoh berikut, nama pengguna yang dimasukkan mestilah gabungan huruf, nombor dan garis bawah, dan nama pengguna mestilah antara 8 dan 20 aksara panjang:

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 berlaku apabila aksara khas tidak ditapis:

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

Dalam pernyataan suntikan di atas, kami tidak menapis pembolehubah $name, dan pernyataan SQL yang kami tidak perlukan dimasukkan ke dalam $name, yang akan memadamkan semua data dalam jadual pengguna.

mysqli_query() dalam PHP tidak dibenarkan untuk melaksanakan berbilang pernyataan SQL, tetapi dalam SQLite dan PostgreSQL, berbilang pernyataan SQL boleh dilaksanakan pada masa yang sama, jadi kami perlu mengesahkan data pengguna ini dengan ketat.

Untuk mengelakkan suntikan SQL, kita perlu memberi perhatian kepada perkara berikut:

  • 1. Jangan sekali-kali mempercayai input pengguna.Semak input pengguna, anda boleh menggunakan ungkapan biasa, atau hadkan panjang; tukar petikan tunggal dan dua "-", dsb.
  • 2. Jangan sekali-kali menggunakan sql pemasangan dinamik, anda boleh menggunakan sql berparameter atau terus menggunakan prosedur tersimpan untuk pertanyaan dan akses data.
  • 3. Jangan sekali-kali menggunakan sambungan pangkalan data dengan keistimewaan pentadbir, gunakan sambungan pangkalan data berasingan dengan keistimewaan terhad untuk setiap aplikasi.
  • 4. Jangan simpan maklumat sulit secara langsung, menyulitkan atau mencincang kata laluan dan maklumat sensitif.
  • 5. Maklumat pengecualian aplikasi harus memberikan sedikit petunjuk yang mungkin, dan yang terbaik adalah menggunakan maklumat ralat tersuai untuk membungkus maklumat ralat asal
  • 6. Kaedah pengesanan suntikan sql secara amnya menggunakan bantuanPerisianAtau platform laman web untuk mengesan, perisian biasanya menggunakan alat pengesan suntikan sql jsky, dan platform tapak web mempunyai alat pengesan platform keselamatan laman web Yisi. MDCOFT SCAN et al.Menggunakan MDCOFT-IPS boleh bertahan dengan berkesan terhadap suntikan SQL, serangan XSS, dsb.

Cegah Suntikan SQL

Dalam bahasa skrip seperti Perl dan PHP, anda boleh melepaskan data yang dimasukkan oleh pengguna untuk menghalang suntikan SQL.

Sambungan MySQL untuk PHP menyediakan fungsi mysqli_real_escape_string() untuk melepaskan aksara input khas.

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

Suntikan dalam Kenyataan Suka

Apabila bertanya seperti, jika pengguna memasukkan nilai dengan "_" dan "%", ini akan berlaku: pengguna pada asalnya ingin menanyakan "abcd_", tetapi hasil pertanyaan termasuk "abcd_", "abcde", dan "abcdf " Dll.; masalah juga berlaku apabila pengguna ingin bertanya "30%" (nota: tiga puluh peratus).

Dalam skrip PHP kita boleh menggunakan fungsi addcslashes() untuk mengendalikan situasi di atas, seperti dalam contoh berikut:

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

Fungsi addcslashes() menambah garis miring ke belakang sebelum aksara yang ditentukan.

Format sintaks:

addcslashes(string,characters)
参数Uraian
rentetanDiperlukan.Menentukan rentetan untuk diperiksa.
aksaraPilihan.Menentukan watak atau julat aksara yang dipengaruhi oleh addcslashes().

发表 评论

Alamat e-mel anda tidak akan diterbitkan. 必填 项 已 用 * 标注

Tatal ke