Pengertian SQL Injection dan Cara menghindarinya


Apa itu SQL Injection?
Sql injection adalah sebuah teknik hacking yang dilakukan dengan menyisipkan baris kode SQL pada kotak isian (misalnya form login) atau pada url yang mana serangan ini akan mempengaruhi logika dari website tersebut.

Sql injection memanfaatkan celah keamanan yang disebabkan karena masukan pengguna tidak disaring secara benar oleh aplikasi.

Bingung?
Mari kita bahas bagaimana website bekerja terlebih dahulu.

Bagaimana website bekerja?
Aplikasi web pasti menggunakan database untuk menyimpan semua data seperti komentar, artikel, termasuk data login, semuanya disimpan di dalam database. Rata-rata database untuk website menggunkan bahasa SQL.

Jadi sekurang kurangnya pasti ada :
Halaman website > backend server > database.

Saat user sedang login, user tersebut harus mengisi username dan password pada sebuah formulir isian bukan?
Pada saat itu username dan password dikirimkan ke server, lalu server mengecek kesesuaian data.

Apakah username tersebut ada di dalam database? (kalau ada maka akan mengembalikan nilai Variable1 = “True”, kalau tidak ada maka Variable1 = “False”),
DAN Apakah passwordnya sesuai dengan apa yang dipasangkan dengan username? (kalau sesuai maka akan mengembalikan nilai Variable2 = “True”, kalau tidak sesuai maka Variable2 = “False”).

Nah pada website yang tingkat keamanannya rendah biasa dilakukan verifikasi langsung seperti ini:
“Jika nilai yang masuk pada formulir isian menghasilkan True maka user dapat login.”

Kita tentu saja berharap nilai True yang didapat adalah hasil dari Variable1 dan Variable2.
Namun bagaimana jika seseorang dapat memasukkan nilai True bahkan tanpa harus menyesuaikan username dan passwordnya di database?
Inilah Salah Satu Teknik SQL Injection.

Seperti apa sih bahasa SQL itu?
Misalnya, kita dapat melakukan perintah sql seperti dibawah ini
select * from account
(pilih semua dari table account)

Akan membuat response seperti ini:

Menampilkan sebuah table yang yang di isi data baris per baris. (gambar diatas tidak berkaitan dengan contoh gambar yang selanjutnya)

Lalu biasanya Logika yang digunakan untuk proses login pada website yang keamanannya rendah adalah seperi ini:
Select * from accounts where username =’$USERNAME’ and password=’$PASSWORD’

(pilih semua dari table account yangmana usernamenya adalah ” $USERNAME ” dan passwordnya sama dengan ” $PASSWORD “). kalau usernamenya ada (True) dan passwordnya sesuai (True) maka user blablabla di ijinkan masuk.

Perlu diperhatikan penggunaan gerbang digital,
Gerbang digital AND adalah jika suatu nilai ada yang memiliki nilai False, maka hasilnya akan False, jadi semua nilai harus True untuk mendapatkan hasil True.
True and False = False
False and True = False
True and True = True

Gerbang digital OR adalah jika ada satu nilai saja yang True, maka hasilnya akan True.
True or False = True
False or False = False
True or True = True

Contoh SQL Injection
Pada pengujian dibawah ini kita anggap usernamenya adalah srinivas dan passwordnya adalah mypassword sedangkan Logika login yang digunakan di asumsikan sama seperti diatas. maka seperti ini yang akan terjadi.


Seperti yang diharapkan, user admin dapat masuk karena passwordnya benar.

Dapat dimengerti bahwa pada inputan username dan password akan mengisi logika yang dijalankan website di belakang layar yang mana menggunakan bahasa SQL.
(apapun yang dimasukkan didalam form input akan mengisi username dan password pada Select * from blablabla…)



User admin dapat login tanpa menggunakan password yang seharusnya.

Perhatikan lagi pada gerbang logika “or” apabila ada salah satu yang bernilai True maka hasilnya True.
Penggunaan tanda petik sangat penting dan perlu ketelitian, lalu tanda pagar dalam bahasa SQL merupakan tanda komentar, jadi setelah tanda pagar kode apapun akan di abaikan.

Bahaya Serangan SQLI
Apa saja kerugian yang bisa disebabkan oleh SQL Injection?

Kemungkinan penyerang dapat mengakses database. dapat mengakes database artinya dapat melihat data-data sensitif,
Dapat login menggunkan hak akses admin,
Dapat mengupload file kedalam website kita.

Bagaimana cara mengatasi SQL Injection?
Dalam hal ini saya memposisikan pembaca sebagai developer, pembuat website itu sendiri.

Lakukan validasi pada setiap formulir isian, misalnya sebelum melakukan logika pengijinan login pastikan data yang masuk di jadikan string value terlebih dahulu. Hindari logika yang terjadi pada contoh diatas.
Pisahkan data dari dari pengkodean SQL.
Ada banyak lagi teknik teknik sql injection selain baypass login, salah satunya dengan memanfaatkan informasi atas jumlah baris dari table database. maka hindari menampilkan id angka (biasanya auto increment), gunakanlah slug sebagai gantinya.
Website yang rentan terhadap SQL Injection biasanya adalah website yang dibangun sendiri tanpa bantuan framework seperti website sekolah (dulu), yang mana developer aplikasinya memikirkan sendiri logika-logika yang beresiko cacat logika. Padahal framework-framework website sekarang sudah berpedoman pada keamanan.

Untuk mencegah Sql Injection di Form Login misalnya dengan cara Bypass, gunakan script mysqli_real_escape_string(); disetiap variabelnya.

Misalnya :
$username = $_POST['username'];

$password = $_POST['password'];

menjadi
$username = mysqli_real_escape_string($conn, $_POST['username'];

$password = mysqli_real_escape_string($conn, $_POST['password'];

$conn adalah variabel dari configurasi database (mysqli_connect)
dan untuk mencegahnya dari url dimana postingan memiliki id, berikut gunakan script dibawah ini, mudah-mudahan bisa membantu :
function filter_param($text,$html=true)

{

$e_s=array('\\','\'','"','*','%',"'",'#');

$d_s=array('','','');

$text = preg_replace( "'<script[^>]*>.*?</script>'si", '', $text );


$text = preg_replace( '/<a\s+.*?href="([^"]+)"[^>]*>([^<]+)<\/a>/is', '\2 (\1)', $text );

$text = preg_replace( '/<!--.+?-->/', '', $text );

$text = preg_replace( '/{.+?}/', '', $text );

$text = preg_replace( '/&nbsp;/', ' ', $text );

$text = preg_replace( '/&amp;/', '', $text );

$text = str_replace( $e_s, $d_s, $text );

$text = strip_tags( $text );

$text = preg_replace("/\r\n\r\n\r\n+/", " ", $text);

$text = $html ? htmlspecialchars( $text ) :

$text;

return $text;

}

digunakan pada tiap id, misalnya pada saat pemanggilan id script ini harus disertakan :
$id = $_GET['id'];

menjadi
$id = filter_param($_GET['id']);

yah, jadi begitu saja untuk mencegahnya, semoga artikel ini bisa bermanfaat dan membantu.

2 comments:
Write komentar
  1. Ada gak script untuk mencegah sql injeksi ?

    ReplyDelete
  2. Pada halaman login misalnya, biasanya ada username dan password bukan ?
    kamu hanya memasukkan scriptnya seprti ini :
    Contoh :
    $username = $_POST['username'];
    $password = $_POST['password'];

    menjadi

    $username = mysqli_real_escape_string($conn, $_POST['username']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);

    dan biasanya juga sering vulnerability (kerentanan) sebuah web di coba melalui url dimana posting nya memiliki id dan menambahkan tanda petik satu (')

    saya akan menambahkan script preg_replace untuk mencegah sql injection di artikel

    ReplyDelete