Injeksi SQL
Injeksi SQL adalah teknik injeksi kode yang dapat merusak database Anda.
Injeksi SQL adalah salah satu teknik peretasan web yang paling umum.
Injeksi SQL adalah penempatan kode berbahaya dalam pernyataan SQL, melalui input halaman web.
SQL di Halaman Web
Injeksi SQL biasanya terjadi saat Anda meminta masukan kepada pengguna, seperti nama pengguna / id pengguna mereka, dan alih-alih nama / id, pengguna memberi Anda pernyataan SQL yang tanpa sadar akan Anda jalankan di database Anda.
Lihat contoh berikut yang membuat pernyataan SELECT dengan menambahkan variabel (txtUserId) ke string pilihan. Variabel diambil dari input pengguna (getRequestString):
Contoh
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
Bagian selanjutnya dari bab ini menjelaskan potensi bahaya menggunakan input pengguna dalam pernyataan SQL.
SQL Injection Berdasarkan 1 = 1 Selalu Benar
Lihat kembali contoh di atas. Tujuan asli dari kode ini adalah untuk membuat pernyataan SQL untuk memilih pengguna, dengan id pengguna tertentu.
Jika tidak ada yang mencegah pengguna memasukkan input yang "salah", pengguna dapat memasukkan beberapa input "pintar" seperti ini:
Identitas pengguna:
Kemudian, pernyataan SQL akan terlihat seperti ini:
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
SQL di atas valid dan akan mengembalikan SEMUA baris dari tabel "Pengguna", karena OR 1 = 1 selalu BENAR.
Apakah contoh di atas terlihat berbahaya? Bagaimana jika tabel "Pengguna" berisi nama dan sandi?
Pernyataan SQL di atas kurang lebih sama dengan ini:
SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;
Seorang peretas mungkin mendapatkan akses ke semua nama pengguna dan kata sandi dalam database, hanya dengan memasukkan 105 OR 1 = 1 ke dalam kolom input.
Injeksi SQL Berdasarkan "" = "" Selalu Benar
Berikut adalah contoh login pengguna di situs web:
Nama pengguna:
Kata sandi:
Contoh
uName = getRequestString("username");
uPass = getRequestString("userpassword");
sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'
Hasil
SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"
Seorang peretas mungkin mendapatkan akses ke nama pengguna dan sandi dalam database hanya dengan memasukkan "OR" "=" ke dalam kotak teks nama pengguna atau sandi:
Nama pengguna:
Kata sandi:
Kode di server akan membuat pernyataan SQL yang valid seperti ini:
Hasil
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
SQL di atas valid dan akan mengembalikan semua baris dari tabel "Users", karena OR "" = "" selalu TRUE.
Injeksi SQL Berdasarkan Pernyataan SQL Batch
Kebanyakan database mendukung pernyataan SQL bertumpuk.
Sekumpulan pernyataan SQL adalah sekelompok dua atau lebih pernyataan SQL, dipisahkan oleh titik koma.
Pernyataan SQL di bawah ini akan mengembalikan semua baris dari tabel "Pengguna", lalu menghapus tabel "Pemasok".
Contoh
SELECT * FROM Users; DROP TABLE Suppliers
Lihat contoh berikut:
Contoh
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
Dan masukan berikut ini:
Identitas pengguna:
Pernyataan SQL yang valid akan terlihat seperti ini:
Hasil
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;
Gunakan Parameter SQL untuk Perlindungan
Untuk melindungi situs web dari injeksi SQL, Anda dapat menggunakan parameter SQL.
Parameter SQL adalah nilai yang ditambahkan ke kueri SQL pada waktu eksekusi, dengan cara yang terkontrol.
Contoh Razor ASP.NET
txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);
Perhatikan bahwa parameter diwakili dalam pernyataan SQL dengan penanda @.
Mesin SQL memeriksa setiap parameter untuk memastikan bahwa itu benar untuk kolomnya dan diperlakukan secara harfiah, dan bukan sebagai bagian dari SQL yang akan dieksekusi.
Contoh lain
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);
Contoh
Contoh berikut menunjukkan cara membuat kueri berparameter dalam beberapa bahasa web umum.
PILIH PERNYATAAN DI ASP.NET:
txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();
MASUKKAN KE PERNYATAAN DI ASP.NET:
txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();
MASUKKAN KE PERNYATAAN DALAM PHP:
$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();