Kamis, 20 Agustus 2015

Mengenal dan Menangkal SQL Injection

SQL Injection dapat merusak database kita. Itulah hal penting yang harus kita ketahui sebelumnya. Jadi, saya akan berbagi pengetahuan tentang SQL Injection yang sudah saya miliki.

Apa itu SQL Injection?

SQL Injection adalah suatu teknik yang memungkinkan pengguna nakal untuk menyuntikkan atau memasukkan perintah SQL ke dalam pernyataan SQL, melalui inputan yang ada pada halaman web. Perintah SQL yang disuntikkan dapat mengubah pernyataan SQL dan mengganggu keamanan aplikasi web.

Contohnya, dengan teknik ini seseorang bisa saja masuk (login) ke dalam sistem tanpa harus memiliki akun(username dan password). Bukan hanya itu saja, SQL Injection juga memungkinkan seseorang untuk memanipulasi (create, read, update, delete) suatu data dalam database... berbahaya bukan?

Beberapa teknik SQL Injection

Kita tidak akan membahas teknik SQL Injection terlalu banyak, karena ilmu security saya masih cetek. Jadi, kita akan membahas yang umum saja.

OR 1=1 itu selalu benar

1=1 itu benar, karena satu memang satu. Iya, kan?

Sebagai contoh, coba kita katakan kalau tujuan kode SQL dibuat adalah untuk memilih user yang telah diberikan user id. Jika tidak ada yang mencegah pengguna untuk memasukkan inputan yang 'salah', pengguna dapat memsukkan inputan yang 'pintar' seperti :

Username

Maka perintah SQL yang akan dieksekusi adalah

SELECT * FROM user WHERE username='' OR 1=1
Arti dari pernyataan SQL berikut adalah memilih semua kolom dari tabel user dimana username kosong atau 1=1.Dengan kata lain, username apapun akan dianggap benar dan dapat memasuki sistem.

OR "="sama dengan TRUE

Bayangkan ada sebuah form untuk mem-verifikasi user login ke sebuah situs web.


Username :
Password :

Dan kode php untuk verifikasinya seperti ini

sql = "SELECT * FROM user WHERE username='".$_POST['username']."' AND password='".$_POST['password']."'"

Seorang hacker pintar bisa saja mendapatkan akses username dan password dalam database hanya dengan memasukkan "or""=" pada username dan password. Sehingga hasilnya seperti berikut:

sql = "SELECT * FROM user WHERE username=""or""="" AND password=""or""=""

Hasil pernyataan SQL di atas valid, dan akan menampilkan seluruh baris yang ada dalam tabel user karena ""="" selalu bernilai TRUE.

 SQL Batched

Kebanyakan database mendukung SQL Batched, yang dipisahkan dengan titik koma (;).

Bayangkan jika anda mempunyai inputan seperti berikut

userid


Dan akan menghasilkan pernyataan seperti berikut:

SELECT * FROM user WHERE username=105;DROP TABLE nama_tabel

Meskipun pengguna tidak berhasil memasuki sistem, akan tetapi pengguna akan menghapus tabel nama_tabel dari database.

Perlindungan

 Salah satu cara untuk melindungi serangan SQL Injection adalah dengan menggunakan parameter SQL. Parameter SQL adalah nilai-nilai yang ditambahkan ke dalam sebuah query SQL ketika dieksekusi, dengan cara yang terkendali.

Untuk php non-OOP, dapat menggunakan mysql_real_escape_string(). Sedangkan php OOP yang menggunakan pdo menggunakan cara berikut :

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

Untuk php OOP yang menggunakan mysqli, mirip dengan yang pdo di atas.


--------
Untuk referensi, silahkan kunjungi https://en.wikipedia.org/wiki/SQL_injection
Sekian, kalau ada pertanyaan jangan malu untuk bertanya.

Tidak ada komentar:

Posting Komentar