SQLite - Injeksi

Jika Anda mengambil input pengguna melalui halaman web dan memasukkannya ke dalam database SQLite, ada kemungkinan Anda membiarkan diri Anda terbuka lebar untuk masalah keamanan yang dikenal sebagai SQL Injection. Di bab ini, Anda akan mempelajari cara membantu mencegah hal ini terjadi dan membantu Anda mengamankan skrip dan pernyataan SQLite Anda.

Injeksi biasanya terjadi saat Anda meminta masukan dari pengguna, seperti nama mereka, dan alih-alih nama, mereka memberi Anda pernyataan SQLite yang akan Anda jalankan tanpa sadar di database Anda.

Jangan pernah mempercayai data yang diberikan pengguna, proses data ini hanya setelah validasi; biasanya, ini dilakukan dengan pencocokan pola. Dalam contoh berikut, nama pengguna dibatasi untuk karakter alfanumerik ditambah garis bawah dan dengan panjang antara 8 dan 20 karakter - ubah aturan ini sesuai kebutuhan.

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 mendemonstrasikan masalahnya, pertimbangkan kutipan ini -

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

Panggilan fungsi seharusnya mengambil catatan dari tabel pengguna di mana kolom nama cocok dengan nama yang ditentukan oleh pengguna. Dalam keadaan normal,$namehanya akan berisi karakter alfanumerik dan mungkin spasi, seperti string ilia. Namun dalam kasus ini, dengan menambahkan kueri yang sepenuhnya baru ke $ name, panggilan ke database berubah menjadi bencana: kueri DELETE yang dimasukkan menghapus semua rekaman dari pengguna.

Ada antarmuka database yang tidak mengizinkan penumpukan kueri atau menjalankan beberapa kueri dalam satu panggilan fungsi. Jika Anda mencoba menumpuk kueri, panggilan gagal tetapi SQLite dan PostgreSQL, dengan senang hati menjalankan kueri bertumpuk, mengeksekusi semua kueri yang disediakan dalam satu string dan membuat masalah keamanan yang serius.

Mencegah Injeksi SQL

Anda dapat menangani semua karakter escape dengan cerdas dalam bahasa skrip seperti PERL dan PHP. Bahasa pemrograman PHP menyediakan fungsi tersebutstring sqlite_escape_string() untuk menghindari karakter masukan yang khusus untuk SQLite.

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

Meskipun pengkodean membuatnya aman untuk memasukkan data, itu akan membuat perbandingan teks sederhana dan LIKE klausa dalam kueri Anda tidak dapat digunakan untuk kolom yang berisi data biner.

Note - addslashes()TIDAK boleh digunakan untuk mengutip string Anda untuk kueri SQLite; itu akan menyebabkan hasil yang aneh saat mengambil data Anda.