BAB17
Mencegah
SQL Injection
Tidak
afdol rasanya apabila buku ini tidak saya lengkapi dengan cara bagaimana
mengamankan sebuah situs web dari aksi SQL Injection ini. Berikut ini beberapa
trik yang perlu anda ketahui untuk mencegah aksi SQL Injection pada situs web
Anda . jika pun tidak bisa mengamankan situs web sepenuhnya. Setidaknya akan
memperlambat seseorang untuk melakukan aksi tersebut.
Dari berbagai kasus
SQL Injection yang telah dijelaskan dalam buku ini, dapat kita tarik
kesimpulan, SQL Injection dapat tejadi karena tidak adanya penanganan terhadap
karakter-karakter tanda petik satu dan juga karakter double minus yang
menyebabkan suatu aplikasi dapat disisipi dengan perintah SQL. Sehingga
seseorang bisa menyisipkanperintah SQL ke dalam suatu parameter maupun suatu
form.
Dari penjelasan di
atas, kita dapat mengambil tindakan pencegahan supaya situs web kita
tidakmenjadi korban serangan SQL Intection.
1.
Batasi panjang input box (jika memungkinkan),
dengan cara membatasinya dikode program. Sehingga orang yang tidak berhak akan
bingung sejenak melihat input box-nya tidak bisa di-inject dengan perintah yang
panjang
2.
Administrator web haruslah tegas menolak user
yang menginput karakter selain abjad dan angka. Karakter khusus dilarang masuk.
Terapkan hal ini, baik input user, parameter URL, dan nilai-nilai dari cookies.
3.
Untuk nilai numeric,konversilah menjdi integer,
sebelum di parsing menjadi statement
SQL. Atau gunakan ISNUMERIC untuk
memastikan data tersebut interger.
4.
Filter input yang dimasukkan oleh user, terutama
penggunaan tanda kutip tunggal (Input
Validation), dan karakter khusus lainnya.
5.
Jika memungkinkan ,buatlah daftar karakter yang boleh digunakan (whitelist).
6.
Batasi karakter
yang boleh diinput oleh pengunjung situs web Anda
7.
Matikan atau sembunyikan pesan-pesan error yang
keluar dari SQL Server yang berjalan.
8.
Matikan fasiltas-fasilitas standar, seperti Stored procedures,Extended Stored Procedures
jika memungkinkan.
9.
Ubah “Startup and run SQL Server” menggunakan low privilege user.
10. Mengganti Error
message (Pesan Error) karena hal ini sering kali digunakan oleh orang yang
tidak berhak untuk menelusuri informasi jalur penyimpanan database.
11. Batasi Permisi hanya pada user yang terotorasi
saja. Sang user tentu saja harus yakin bahwa data yang dia terima sudah akurat dan
tidak ceroboh memodifikasinya.
12. Kalau
bisa, hilangkan show error mysql pada
konfigurasi PHP.
13. Jangan
percaya bahwa ada 100% system kita aman, selalu lakukan update secara berkala.
14. Bagi
Anda yang menggunakan CMS, sangat disarankan untuk sering-sering meng-update
CMS.
15. Sering-seringlah
untuk memeriksa apakah terdapat bug pada situs web yang Anda kelola. Cara yang
paling mudah adalah menggunakan tool SQL Injection yang telah dibahas pada bab
sebelumnya. Karena Anda bisa menemukan sendiri kelemahan pada situs web Anda,
sebelumnya ditemukan oleh orang lain Supaya dari poin-poin diatas tidak terasa
hanya teori,berikut saya berikan beberapa penjelasan detail untuk mencegah
serangan SQL injection.
K O N F I G U R A S I
Dalam PHP Anda dapat melakukan hal ini
menggunakan perintah using
error_reporting(0); pada setiap kode atau dalam file konfigurasi php.ini.
Berikut beberapa konfigurasi PHP lainnya
yang bisa anda terapkan apabila Anda merasa tidak memerlukan konfigurasi
tersebut.
·
Register_globals (Atur menjadi off)
·
Allow_url_fopen (Atur menjadi off)
·
Magic_quotes_gpc (Atur menjadi off)
·
Magic_quotes_runtime(Atur menjadi off)
·
Safe_mode and open_basedir(Secara default dalam
kondisi disanled, namun dapat diaktifkan ‘enable’ lalu melakukan konfigurasi
yang sesuai dengan keamanan yang Anda perlukan. Namun Anda perlu berhati hati
mengonfirgurasi fungsi ini.)
Anda juga dapat menggunakan
beberapa fungsi pada PHP untuk memblok fungsi validasi input.
·
Is_<type>(input)
Periksa jenis input berdasarkan type-nya apakah string atau numerik.
Contohnya,is_numeric().
·
Strlen(input)
Periksa panjang karakter input.
·
Preg-match(regex,
matchstring) Cocokan parameter umum dengan matchstring
menggunakan parameter regex.
Contoh penggunaan preg_matc
untuk memvalidasi parameter adalah:
Susername =
$_POST[‘username’]; if
{!preg_match(“/^[a-zA-Z] {8,12} $/D”,$username) {// handle failed validation}
S C R I P T A S P M
E N C E G A H S Q L
I N J E C T I O N
Berikut ini syantax bagi Anda yang
mengunakan ASP untuk mencegah SQL injection dengan memeriksa setiap karakter
inputan yang masuk kedalam database malalui statement SQL. Misalnya pada kasus
berikut kita harus mencegah karakter ‘(single quote) untuk diproses kedalam databases
atau kita bisa mengganti karakter ‘(single quote) yang masuk dengan” (double
single quote). Adapun contoh script login_process.asp yang sudah dimodifikasi
agar mencegah SQL injection adalah
sebagai beikut.
<%
option explicit >%
<%
Dim connstring,conn,recset
Connstrig = “provider=SQLOLEDB.1;
Password=rahasia; Persist
Security
Info=True; User ID=Sa; Intital Catalog= sqlinject; Data
Source=localhost”
Set conn = server.createobject(
“adodb.connection”)
Set recset = server.createobject(
“adodb.recordset”)
Conn.open connstring
Recet.open “select * from tbUser where
username = ‘ “ &
Replace
(request.from(“username”), ” ‘ “ , ” ‘ ‘ “) & “ ‘ and password =
‘ “ &
replace(request.from(“password”) , “ ‘ “ ,” ‘ ‘ “ & “ ‘ “ ,conn,3 , 2
If not recset.eof then
Response.write recset.recordcount
Session (“username”) = reques.from
(“username”)
Response.redirect “secured_page.asp”
Else
Responseredirect “login.asp”
End if
%>
Dari kode
diperhatikan pada inputan username dan password,terdapat sedikit modifikasi
dengan mengganti dari request.from(“username)
Replace(request.from(“username”) , “ ‘ “ , “ ‘ ‘
“),
demikian juga untuk yang bagian password.
K A R A K T
E R E N K O D E
Sebagai tambahan,
PHP juga menyediakan fungsi mysql_real_escape(), yang berfungsi untuk megubah
tanda kutip single quote (‘) menjadi backslash (\) secara otomatis.
Jika Anda
perhatikan dalam bab terdahulu terlihat bahwa pemakaian karakter enkode adalah
satu usaha untuk meingkatkan keamanan situs web dari serngan SQL Intection
,Anda tetap dapat menggunakan hal tersebut. Selain itu, Anda juga bisa
menggunakan beberapa bentuk enkode lainnya. Misalnya, untuk membuat enkode dari
karakter kutip tunggal (single quote), Anda bisa mencoba beberapa alternative
berikut.
Representasi
|
Jenis Enkode
|
%27
%2527
%317
%u0027
%u02b9
%ca%b9
'
'
'
%26apos;
|
URL
enconding
Double
URL enconding
Nested
double URL enconding
Unicode
representation
Unicode
representation
Unicode
representation
HTML
entity
Decimal
HTML entity
Hexadecimal
HTML entity
Mixed
URL/HTML enconding
|
Namun ,
Anda perlu berhati-hati dalam mengubah pemakaian kode setting karena terkadang
karakter-karakter tertentu juga diperlukan untuk mengeksekusi perintah SQL yang
Anda gunakan.
By: Efvy
Zam
Penerbit
: PT Elex Media Komputindo
Karya :
KOMPAS GRAMEDIA
Penulis :
RIZKI MELAWATI
Judul
buku :SQL INJECTION
ConversionConversion EmoticonEmoticon