tutorial pengembangan web terbaru
 

SQL Injeksi


Sebuah SQL Injection dapat menghancurkan database Anda.


SQL di Halaman Web

Dalam bab-bab sebelumnya, Anda telah belajar untuk mengambil data database (dan update), menggunakan SQL.

Ketika SQL digunakan untuk menampilkan data pada halaman web, itu adalah umum untuk membiarkan pengguna web masukan nilai-nilai pencarian mereka sendiri.

Sejak pernyataan SQL yang teks saja, mudah, dengan sepotong kecil kode komputer, untuk secara dinamis mengubah pernyataan SQL untuk menyediakan pengguna dengan data yang dipilih:

Kode Server

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

Contoh di atas, menciptakan pernyataan pilih dengan menambahkan variabel (txtUserId) ke pilih tali. variabel diambil dari input pengguna (Request) ke halaman.

Sisa bab ini menggambarkan potensi bahaya dari penggunaan input pengguna dalam pernyataan SQL.


SQL Injection

SQL injection adalah teknik di mana pengguna yang jahat dapat menyuntikkan perintah SQL ke dalam pernyataan SQL, melalui masukan halaman web.

perintah SQL disuntikkan dapat mengubah pernyataan SQL dan mengganggu keamanan aplikasi web.


SQL Injection Berdasarkan 1 = 1 Selalu Benar

Lihatlah contoh di atas, sekali lagi.

Katakanlah bahwa tujuan asli dari kode adalah untuk menciptakan pernyataan SQL untuk memilih pengguna dengan user id yang diberikan.

Jika tidak ada yang mencegah pengguna dari memasuki "wrong" masukan, pengguna dapat memasukkan beberapa "smart" masukan seperti ini:

Identitas pengguna:

Hasil Server

SELECT * FROM Users WHERE UserId = 105 or 1=1

SQL di atas adalah valid. Ini akan mengembalikan semua baris dari Pengguna meja, karena MANA 1 = 1 selalu benar.

Apakah contoh di atas tampaknya berbahaya? Bagaimana jika tabel Pengguna berisi nama dan password?

Pernyataan SQL di atas adalah sama seperti ini:

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

Seorang hacker yang cerdas mungkin mendapatkan akses ke semua nama pengguna dan password dalam database dengan hanya memasukkan 105 atau 1 = 1 ke kotak input.


SQL Injection Berdasarkan ""="" Selalu Benar

Berikut adalah konstruksi umum, digunakan untuk memverifikasi user login ke situs web:

Nama pengguna:

Kata sandi:

Kode Server

uName = getRequestString("UserName");
uPass = getRequestString("UserPass");

sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'"

Seorang hacker yang cerdas mungkin mendapatkan akses ke nama pengguna dan password dalam database dengan hanya memasukkan "atau ""=" menjadi nama pengguna atau sandi kotak teks.

Kode di server akan membuat pernyataan SQL yang valid seperti ini:

Hasil

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""

Hasil SQL valid. Ini akan mengembalikan semua baris dari Pengguna meja, karena WHERE "" = "" selalu benar.


SQL Injection Berdasarkan Laporan SQL Batched

Kebanyakan database mendukung pernyataan SQL batched, dipisahkan dengan titik koma.

Contoh

SELECT * FROM Users; DROP TABLE Suppliers

SQL di atas akan mengembalikan semua baris dalam tabel Pengguna, dan kemudian menghapus tabel disebut Pemasok.

Jika kita memiliki kode server berikut:

Kode Server

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

Dan input berikut:

Identitas pengguna:

Kode di server akan membuat pernyataan SQL yang valid seperti ini:

Hasil

SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers

Parameter untuk Perlindungan

Beberapa pengembang web menggunakan "blacklist" dari kata-kata atau karakter untuk mencari di masukan SQL, untuk mencegah serangan injeksi SQL.

Ini bukan ide yang sangat bagus. Banyak kata-kata ini (seperti menghapus atau drop) dan karakter (seperti titik koma dan tanda kutip), yang digunakan dalam bahasa umum, dan harus diizinkan di banyak jenis input.

(Bahkan harus sangat legal untuk masukan pernyataan SQL dalam bidang database.)

Satu-satunya cara yang telah terbukti untuk melindungi situs web dari serangan injeksi SQL, adalah dengan menggunakan parameter SQL.

parameter SQL adalah nilai-nilai yang ditambahkan ke sebuah query SQL pada waktu eksekusi, dengan cara yang terkendali.

ASP.NET Razor Contoh

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);

Perhatikan bahwa parameter diwakili dalam laporan SQL oleh @ penanda.

Mesin SQL memeriksa setiap parameter untuk memastikan bahwa itu adalah benar untuk kolom 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);

Anda baru saja belajar untuk menghindari SQL injection. Salah satu kerentanan situs top.


contoh

Contoh berikut menunjukkan bagaimana untuk membangun query parameter dalam beberapa bahasa web umum.

SELECT 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();

INSERT INTO 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();

INSERT INTO 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();