Selasa, 23 September 2014

Mencegah Website dari serangan SQL Injection & XSS

1 . Mencegah web dari SQL injection

SQL Injection
? Apa itu? Ya, beberapa dari kita para developer web sudah mendengar hal ini, bahkan seorang yang bukan developer web pun juga mengetahuinya. SQL Injection merupakan salah satu teknik serangan terhadap sebuah situs atau website. Serangan ini memanfaatkan kesalahan perintah SQL yang dikirimkan dari web ke database server untuk dieksekusi oleh databaseserver. 


Pada umumnya sintak SQL yang sering dipakai pada proses developing atau pembuatan sebuah situs iyalah sintak DML(Data Manipualtion Language) yakni INSERT, UPDATE danDELETE. Pada umumnya sintak yang dikirim seperti ini 

select * from `tblBerita` where `id` = 10
10 didapat dari hasil parsing parameter url
http://www.website.com/index.php?id=10
 
 
maka pada penulisan sintak php akan menjadi seperti ini

$SQL="select * from `tblBerita` where `id` = '".$_GET['id']."'";
pada proses eksekusi normal sintak tersebut, database server akan memberikan balikan hasil sesuai yang parameter yang dikirimkan. Namun bila kita meracuni parameter yang dikirim melalu url dengan sebuah karakter khusus yaitu single quote ( ' ) seperti ini 
http://www.website.com/index.php?id=10'
maka SQL query tersebut tidak akan bisa di eksekusi dan database server akan memberikan balikan berupa pesan error seperti berikut

 #1064 - You have an error in your SQL syntax; check the manual that corresponds 
to yourMySQL server version for the right syntax to use near ''' at line 1
mengapa? karena SQL yang dikirimkan ke database adalah seperti ini 

select * from `tblBerita` where `id` ='10''
perhatikan setelah nilai 10 terdapat dua buah single quote. Hal ini lah yang menyebabkan error, dan hal ini lah yang mejadi celah sebuah situs dan dengan mudah di eksploitasi dengan metode SQL Injection. 

Nah, bagaimana kita mengatasi hal ini? Ya, caranya adalah dengan melakukan sanitasi pada data yang dikirimkan dari url. 

PHP sendiri telah menyediakan method khusus untuk menangani hal ini, yaitumysql_real_escape atau mysql_real_escape_stringNamun kita juga bisa membuat sebuah method khusus untuk mengerjakan hal ini, yang penting tujuannya adalah untuk sanitasi data yang dikirimkan.

Saat penggunakan method itu maka sintak pengiriman SQL Query ke database server akan menjadi seperti ini
$SQL="select * from `tblBerita` where `id` = '".mysql_real_escape_string($_GET['id'])."'";
dan querynya akan mejadi seperti ini bila ada penambahan single quote pada url
select * from `tblBerita` where `id`='10'\'
dengan demikian, database hanya akan membaca 1 singel quote didepan angka 10 dan 1 single quote dibelakang angka 10, sedangkan 1 karakter single quote tambahan dibelakang angka 10 akan terabaikan karena adanya karakter back slash ( \ )
Demikianlah tutorial singkat dari saya mengenai Proteksi Website dari Serangan SQL Injection.
regards

2 . Cara pencegahan SQL INJECTION
1) Batasi panjang input box (jika memungkinkan), dengan
cara membatasinya di kode program, jadi si cracker pemula akan bingung sejenak melihat input box nya gak bisa diinject dengan perintah yang panjang.
2) Filter input yang dimasukkan oleh user, terutama penggunaan tanda kutip tunggal (Input Validation).
3) Matikan atau sembunyikan pesan-pesan error yang keluar dari SQL Server yang berjalan.
4) Matikan fasilitas-fasilitas standar seperti Stored Procedures, Extended Stored Procedures jika memungkinkan.
5) Ubah “Startup and run SQL Server” menggunakan low privilege user di SQL Server Security tab.


Cara Mengatasi Serangan XSS 

XSS merupakan salah satu jenis serangan injeksi code (code injection attack). XSS dilakukan oleh penyerang dengan cara memasukkan kode HTML atau client script code lainnya ke suatu situs. Serangan ini akan seolah-olah datang dari situs tersebut. Akibat serangan ini antara lain penyerang dapat mem-bypass keamanan di sisi klien, mendapatkan informasi sensitif, atau menyimpan aplikasi berbahaya.

Dikutip dari Wikipedia


Disini saya hanya menerangkan tempat dimana XSS dapat dilakukan

XSS yang paling banyak digunakan adalah jenis GET dan POST.
Salah satu contoh yang akan dibahas adalah jenis GET.

Lihat gambar dibawah ini :
image
Masukkan script alert sederhana ini pada URL yang mempunyai request GET
http://localhost/Momonimo/search?search_key=<script>alert('XSS TRUE')</script>

Jika halaman tersebut (yang mempunyai database) dapat melakukan XSS, maka akan tampil alert seperti gambar sebagai berikut :
image


Mengatasi XSS

---------------------------------------------------
PHP sangat handal dalam melakukan konversi string dengan cepat. Tetapi jenis apa yang akan anda lakukan jika hal diatas terjadi?

Saya melakukan survey terhadap teman-teman programmer.
Tidak sedikit yang menjawab "Pakai saja htmlentities() atau strip_tags()"

htmlentities() memang dapat melakukan konversi tag-tag HTML, tetapi bagaimana dengan Javascript?

strip_tags() memang dapat melakukan konversi tag-tag HTML dan PHP dengan NULL byte, tetapi bagaimana dengan Javascript?

Lalu apa yang harus dilakukan?
Saya memakai filter_var() dengan tipe filter Sanitize
Caranya sebagai berikut :

filter_var($val, FILTER_SANITIZE_STRING);

Dan hasilnya adalah :
image

Berikut adalah Fungsi untuk keseluruhannya :

function xss_filter($val) {
 $val = htmlentities($val); 
 $val = strip_tags($val);
 $val  = filter_var($val, FILTER_SANITIZE_STRING);
 
 return $val;
}


Saya membuat Fungsi diatas (dengan menambahkan htmlentities dan strip_tags) agar XSS key yang digunakan dapat terbaca semua. Semata-mata hanya ingin membuat rasa penasaran para hacker

0 komentar:

Posting Komentar

×