Tutorial klasik...login
Tutorial klasik SQLite
pengarang:php.cn  masa kemas kini:2022-04-13 17:05:02

Suntikan SQLite


Jika tapak anda membenarkan pengguna memasukkan melalui halaman web dan memasukkan kandungan input ke dalam pangkalan data SQLite, anda menghadapi isu keselamatan yang dipanggil suntikan SQL. Bahagian ini akan menunjukkan kepada anda cara untuk menghalang perkara ini daripada berlaku dan memastikan keselamatan skrip dan pernyataan SQLite anda.

Suntikan biasanya berlaku apabila input pengguna diminta, seperti memerlukan pengguna memasukkan nama, tetapi pengguna memasukkan pernyataan SQLite, dan pernyataan ini dijalankan pada pangkalan data tanpa disedari.

Jangan sekali-kali mempercayai data yang disediakan pengguna, jadi hanya proses data yang lulus pengesahan Peraturan ini dicapai melalui padanan corak. Dalam contoh di bawah, nama pengguna nama pengguna dihadkan kepada aksara abjad angka atau garis bawah dan mestilah antara 8 dan 20 aksara panjang - ubah suai peraturan ini mengikut keperluan.

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){
   $db = new SQLiteDatabase('filename');
   $result = @$db->query("SELECT * FROM users WHERE username=$matches[0]");
}else{
   echo "username not accepted";
}

Untuk menunjukkan masalah, pertimbangkan petikan ini:

$name = "Qadir'; DELETE FROM users;";
@$db->query("SELECT * FROM users WHERE username='{$name}'");

Panggilan fungsi adalah untuk mendapatkan semula lajur nama daripada jadual pengguna yang sepadan dengan nama yang ditetapkan oleh pengguna padanan. Biasanya, $name hanya mengandungi aksara atau ruang abjad angka, seperti rentetan ilia. Tetapi di sini, pertanyaan baharu dilampirkan pada $name, dan panggilan ke pangkalan data ini akan menyebabkan masalah besar: pertanyaan DELETE yang disuntik akan memadamkan semua rekod untuk pengguna.

Walaupun sudah ada antara muka pangkalan data yang tidak membenarkan tindanan pertanyaan atau melaksanakan berbilang pertanyaan dalam satu panggilan fungsi Jika anda cuba menyusun pertanyaan, panggilan akan gagal, tetapi SQLite dan PostgreSQL masih melakukan pertanyaan bertindan. iaitu, jalankan Sediakan semua pertanyaan dalam rentetan, yang menyebabkan isu keselamatan yang serius.

Cegah SQL Injection

Dalam bahasa skrip, seperti PERL dan PHP, anda boleh mengendalikan semua aksara melarikan diri dengan bijak. Bahasa pengaturcaraan PHP menyediakan fungsi rentetan sqlite_escape_string() untuk melepaskan aksara input yang khas untuk SQLite.

if (get_magic_quotes_gpc()) 
{
  $name = sqlite_escape_string($name);
}
$result = @$db->query("SELECT * FROM users WHERE username='{$name}'");

Walaupun pengekodan menjadikan memasukkan data selamat, ia memberikan perbandingan teks mudah dalam pertanyaan yang klausa SUKA tidak tersedia untuk lajur yang mengandungi data binari.

Sila ambil perhatian bahawa addslashes() tidak boleh digunakan untuk memetik rentetan dalam pertanyaan SQLite, ia boleh membawa kepada hasil yang pelik apabila mendapatkan semula data.

Laman web PHP Cina