SQL Multi Table Dan SQL Bertingkat
SQL Multi Table Dan SQL Bertingkat
Inner Join
Dengan inner join, tabel akan digabungkan dua arah, sehingga tidak ada data yang NULL di satu sisi.
Sebagai contoh, kita akan menggabungkan tabel pelanggan dan pesan dimana kita akan menampilkan daftar
pelanggan yang pernah melakukan pemesanan (transaksi). Misalkan isi tabel pelanggan dan pesan adalah sebagai
berikut :
Tabel pelanggan (hanya ditampilkan field id_pelanggan, nm_pelanggan dan email)
Tabel Pesan.
WHERE tabel1.PK=tabel2.FK;
Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan, pesan.id_pesan, pesan.tgl_pesan
WHERE pelanggan.id_pelanggan=pesan.
Hasilnya Berikut:
Pada hasil perintah query di atas terlihat bahwa terdapat 5 (lima) transaksi yang dilakukan oleh 3 (tiga)
orang pelanggan. Jika kita lihat kembali isi tabel pelanggan di atas, maka terdapat satu pelanggan yang tidak
ditampilkan yaitu yang memiliki id pelanggan P0003. Pelanggan tersebut tidak ditampilkan karena belum pernah
melakukan transaksi.
ON tabel1.PK=tabel2.FK;
Dan berikut ini perintah SQL penggabungan tabel pelanggan dan pesan.
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan, pesan.id_pesan, pesan.tgl_pesan
ON pelanggan.id_pelanggan=pesan.
Mari kita lihat contoh penerapan SQL Injection seperti di bawah. Perlu diketahui bahwa contoh yang saya
gunakan adalah dengan bahasa pemrograman PHP dan database MySQL.
Seringkali ketika kita akan mengambil data dari database, kita akan menggunakan query seperti
"SELECT * FROM table_user WHERE username = '".$username."';"
Ketika user memasukkan data ke variable $username dengan nilai etersoul maka kode di atas akan berubah
menjadi:
SELECT * FROM table_user WHERE username = 'etersoul';
Hasil di atas tampak tidak bermasalah dan dengan mudah sang programmer akan mendapatkan semua
data mengenai seorang user dari table_user yang memiliki username = ‘etersoul’. Masalah akan timbul bila seorang
hacker (atau user lain) yang mencoba untuk memasukkan nilai ' OR 1 = 1; -- ke dalam variabel $username.
Maka hasil dari penggunaan variabel tersebut adalah:
Query di atas akan mengambil semua data yang terdapat dalam table_user karena terdapat nilai 1 = 1 yang
selalu bernilai true. Sedangkan penggunaan -- berguna agar kode setelah tanda tersebut dianggap sebagai
komentar (comment) dan tidak dieksekusi oleh SQL. Seorang hacker bisa saja menggunakan data yang telah
didapat di atas untuk keperluan yang buruk misalnya menggunakan account user karena password telah diketahui
(walau pada kenyataannya saat ini kebanyakan password telah dienkripsi atau diacak sebelum dimasukkan ke
database).
Bila contoh di atas tidak cukup, mari kita coba menggunakan
SELECT * FROM table_user WHERE username = '; DROP TABLE table_user; --'
Setelah query tersebut dieksekusi, maka hilanglah tabel table_user dari database Anda, kecuali Anda memiliki
backup atas table itu.
Cara Pencegahan
Cara yang dapat dilakukan cukup mudah. Di PHP sendiri disediakan
fungsi mysql_real_escape_string() yang dapat digunakan untuk “membersihkan” (sanitize) string dengan
melakukan escape atau perubahan terhadap karakter-karakter tertentu, misalnya karakter \ menjadi \\, ” menjadi \”
sehingga tidak terjadi salah “asumsi” oleh SQL. Sedangkan untuk melakukan sanitize terhadap integer dapat
digunakan fungsi intval(). Untuk float dapat digunakan floatval(). Sekarang mari kita lihat kode hacker di atas setelah
di-sanitize dengan mysql_real_escape_string($username);
SELECT * FROM table_user WHERE username = '\' OR 1 = 1; --'
atau
SELECT * FROM table_user WHERE username = '\'; DROP TABLE table_user; --'
Yah, sekarang tanda ‘ telah di-escape menjadi \’ sehingga SQL tidak akan menganggap tanda kutip tersebut sebagai
bagian dari perintah SQL untuk menutup tanda kutip sebelumnya, melainkan sebagai sebuah karakter.
Untuk bahasa pemrograman lainnya umumnya telah disediakan juga fungsi untuk melakukan escape
terhadap string (umumnya fungsi tersebut menggunakan kata escape). Dalam PHP sendiri dapat digunakan
mysql_escape_string(), akan tetapi fungsi ini tidak disarankan untuk digunakan karena tidak melakukan escape
terhadap beberapa jenis karakter.
Yah, itulah sedikit penjelasan mengenai SQL Injection. Semoga hal ini dapat membantu Anda dalam
membuat program yang baik dan aman.