Tutorial SQL

SQL RUMAH Pengenalan SQL Sintaks SQL Pilih SQL SQL Pilih Berbeda SQL Dimana SQL Dan, Atau, Tidak Perintah SQL Oleh SQL Sisipkan Ke Nilai Null SQL Pembaruan SQL Hapus SQL SQL Pilih Atas SQL Min dan Maks Hitung SQL, Rata-Rata, Jumlah SQL Suka SQL Wildcard SQL In SQL Antara SQL Alias SQL Bergabung Gabung Dalam SQL SQL Kiri Gabung SQL Benar Bergabung Gabung Penuh SQL SQL Self Gabung SQL Union Grup SQL Oleh SQL Memiliki SQL Ada SQL Apa saja, Semua SQL Pilih Ke Sisipkan SQL Ke Pilih Kasus SQL Fungsi SQL Null Prosedur Tersimpan SQL Komentar SQL Operator SQL

Basis Data SQL

SQL Buat DB SQL Drop DB SQL Cadangan DB SQL Buat Tabel Tabel Jatuhkan SQL Tabel Ubah SQL Batasan SQL SQL Bukan Null SQL Unik Kunci Utama SQL Kunci Asing SQL Pemeriksaan SQL SQL Default Indeks SQL Peningkatan Otomatis SQL Tanggal SQL Tampilan SQL Injeksi SQL SQL Hosting Tipe Data SQL

Referensi SQL

Kata Kunci SQL Fungsi MySQL Fungsi SQL Server Fungsi Akses MS Referensi Cepat SQL

Contoh SQL

Contoh SQL Kuis SQL Latihan SQL Sertifikat SQL

Injeksi SQL


Injeksi SQL

Injeksi SQL adalah teknik injeksi kode yang dapat menghancurkan 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 ketika Anda meminta input dari 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 SELECTpernyataan dengan menambahkan variabel (txtUserId) ke string pilihan. Variabel diambil dari input pengguna (getRequestString):

Contoh

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

Sisa bab ini menjelaskan potensi bahaya menggunakan input pengguna dalam pernyataan SQL.


Injeksi SQL Berdasarkan 1 = 1 Selalu Benar

Perhatikan kembali contoh di atas. Tujuan asli dari kode ini adalah untuk membuat pernyataan SQL untuk memilih pengguna, dengan id pengguna yang diberikan.

Jika tidak ada yang mencegah pengguna memasukkan input "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 TRUE.

Apakah contoh di atas terlihat berbahaya? Bagaimana jika tabel "Pengguna" berisi nama dan kata sandi?

Pernyataan SQL di atas hampir sama dengan ini:

SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;

Seorang hacker mungkin mendapatkan akses ke semua nama pengguna dan password 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 kata sandi dalam database hanya dengan memasukkan " ATAU ""=" ke dalam kotak teks nama pengguna atau kata 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 "Pengguna", karena OR ""="" selalu TRUE.


Injeksi SQL Berdasarkan Pernyataan SQL Batch 

Sebagian besar database mendukung pernyataan SQL batch.

Kumpulan 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

Lihatlah contoh berikut:

Contoh

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

Dan berikut masukannya:

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 Pisau Cukur 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 DI 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();