Latest web development tutorials

SQLite injeksi

Jika situs web Anda memungkinkan pengguna untuk input, dan masukan ke dalam database SQLite, kali ini Anda dihadapkan dengan masalah keselamatan dikenal sebagai SQL injection. Bab ini akan menunjukkan cara untuk mencegah hal ini terjadi, dan untuk memastikan laporan SQLite skrip keamanan.

Injeksi biasanya terjadi ketika meminta input pengguna, seperti kebutuhan pengguna untuk memasukkan nama, namun pengguna telah memasuki pernyataan SQLite, dan pernyataan ini akan dijalankan pada database tidak sadar.

Tidak pernah Data yang disediakan kepercayaan pengguna, pengolahan data sehingga hanya divalidasi, aturan dilakukan dengan pencocokan pola. Pada contoh berikut, nama pengguna nama pengguna dibatasi untuk karakter alfanumerik atau garis bawah, panjang harus antara 8-20 karakter - menurut perlu memodifikasi aturan ini.

if (preg_match ( "/ ^ \ w {8,20} $ /", $ _GET [ 'username'], $ pertandingan)) {
   $ Db = baru SQLiteDatabase ( 'filename');
   $ Hasil = @ $ db-> query ( "SELECT * FROM pengguna WHERE username = $ pertandingan [0]");
} Lain {
   echo "nama pengguna tidak diterima";
}

Untuk menunjukkan masalah ini, pertimbangkan hipotesis kutipan ini: untuk menunjukkan masalah, pertimbangkan kutipan ini:

$ Nama = "Qadir '; DELETE FROM pengguna;";
@ $ Db-> query ( "SELECT * FROM pengguna WHERE username = '{$ nama}'");

Fungsi panggilan untuk mengambil nama kolom yang ditetapkan dengan nama pengguna sesuai dengan catatan dari tabel user. Dalamkeadaan normal, $ nama hanya berisi karakter dan spasi alfanumerik, seperti ilia tali.Tapi di sini, untuk $ nama menambahkan permintaan baru, panggilan ke database akan menyebabkan masalah bencana: disuntikkan permintaan DELETE untuk menghapus semua catatan pengguna.

Meskipun ada tidak diperbolehkan untuk menjalankan interface query atau database susun beberapa pertanyaan dalam panggilan fungsi tunggal, jika Anda mencoba untuk tumpukan query, maka panggilan gagal, tapi SQLite dan PostgreSQL masih ditumpuk di query, yang menyediakan eksekusi dalam sebuah string semua pertanyaan, yang dapat menyebabkan masalah keamanan serius.

Mencegah SQL injection

Dalam bahasa scripting seperti PERL dan PHP, Anda terampil dapat menangani semua karakter melarikan diri. PHP menyediakan bahasa pemrograman fungsi stringsqlite_escape_string () untuk SQLite digunakan untuk melarikan diri karakter khusus input.

jika (get_magic_quotes_gpc ()) 
{
  $ Nama = sqlite_escape_string ($ nama);
}
$ Hasil = @ $ db-> query ( "SELECT * FROM pengguna WHERE username = '{$ nama}'");

Meskipun data dikodekan sehingga insert dibuat aman, tetapi akan membuat perbandingan teks sederhana, dalam query, kolom berisidata biner, SEPERTI klausa tidak tersedia.

Harap dicatat, addslashes () tidak harus dirujuk dalam query string SQLite, hal itu akan menyebabkan hasil yang aneh ketika mengambil data.