Rabu, 17 April 2013

Mencegah SQL Injection

Ini hanya sebuah catatan untuk diri sendiri, karena kalau ditulis di file sulit mencarinya jadi dishare saja supaya bisa sama sama belajar. SQL Injection kata orang adalah trend lama penyerangan Script yang dibangun dengan PHP, jaman dulu sangat trend sekali tapi jangan salah saat ini pun teknik ini masih suka dicoba.



Baiklah, tanpa basa-basi lagi mari saja kita memulai tekniknya.

1. Dengan cara menjadikan variabel get menjadi absolute integer
SQL Injection biasanya para hacker melakukan penetrasi terhadap variabel id yang kita letakkan pada url.

Contoh:
1http://situskorban.com/berita.php?id=1
ketika akan membaca isi dari variabel id biasanya kita menggunakan syntak
1<?php
2 
3$id $_GET['id'];
4 
5?>
jadi setiap isi dari id pada url akan disimpan pada variable $id

Dan berikut adalah query yang menghubungkan ke database
1"SELECT * FROM tbl_berita WHERE id='$id'"
Pada variabel $id ini lah hacker dapat menggunakan SQL Injection dengan memasukkan perintah2 SQL yang dapat mengeksploitasi database.

Solusinya adalah kita buat id menjadi absolute integer dengan mengubah sintaks pembacaan variabel get id menjadi:
1<?php
2 
3$id abs((int)$_GET['id']);
4 
5?>
Mengapa ditambah abs()? karena abs() digunakan untuk menghilangkan tipe data minus dan int digunakan untuk mengubah tipe data menjadi integer (hanya mengijinkan tipe data integer). jadi ketika variabel id pada url di rubah secara manual dan diisi dengan sintak SQL yang berupa string maka tetap dibaca 0.

2. Dengan menambahkan variabel get berisi enkripsi md5 yg divariasi pada url
Seperti pada no.1 diatas dengan mengunakan URL
1http://situskorban.com/berita.php?id=1
Maka kita perlu menambahkan variabel yg berisi enkripsi md5 dari id yg kita modifikasi dengan string acak menjadi
1http://situskorban.com/berita.php?id=1&token=jk340i34a3fdvaj4333j3n43jj42l30abyk9
Maksud dari variabel token diatas ketika awal kita memberikan link untuk menampilkan berita lain, maka id dari berita tersebut kita enkripsi seperti berikut ini
1<?php
2 
3$token = md5(md5($id_berita).md5('kata acak'));
4 
5//url beritanya
6<a href="berita.php?id=$id_berita&token=$token">Judul Berita</a>
7 
8?>
Sekarang pada halaman tampil berita kita tambahkan pengecekan apakah id berita diganti/diinject manual oleh user dengan cara :
01<?php
02 
03$id_berita=$_GET['id_berita'];
04$token=$_GET['token'];
05$cek=md5(md5($id_berita).md5('kata acak'));
06if($token==$cek){
07   //masukkan syntak untuk menampilkan berita disini
08}
09else{
10   echo "SQL Injection detected..!!!!";
11}
12 
13?>
Tinggal Anda coba terapkan di situs Anda

3. Untuk form login, dengan melakukan enkripsi password atau merubah algoritma autentikasi login
Mungkin sobat semua udah pada tahu pada point yang ke-3 ini yaitu menggunakan md5 untuk autentikasi pengecekan pada saat user login. Namun walaupun begitu saya coba untuk membahasnya kembali untuk yang belum tahu.

Biasanya pada form login melakukan pengecekan ketika user login yaitu dengan melakukan query ke database secara langsung. Contohnya sebagai berikut:
01<?php
02 
03$username $_POST[username];
04$password $_POST[password];
05  
06$r=mysql_query("SELECT * FROM tbl_user WHERE username='$username' and password='$password'");
07$jml_row=mysql_num_rows($r);
08if($jml_row > 0){
09     echo "Login Sukses";
10}
11else{
12     echo "Login Gagal";
13}
14 
15?>
Autentikasi login seperti diatas sangat rentan terhadap penetrasi SQL Injection..
solusi pertama dengan melakukan enkripsi pada password yaitu dengan mengganti
skrip berikut :
1<?php
2 
3$password=md5($_POST[password]);
4 
5?>
Solusi kedua yaitu dengan merubah algoritma menjadi:
1$d=mysql_fetch_array($r);
2if($jml_row >0 && ($d[password]==$password))
Dilihat dari script diatas bahwa Anda dapat menambah pengecekan inputan password thd password di database.

Berikut adalah hasil dari script yang telah kita ubah tadi
01<?php
02 
03$username $_POST[username];
04$password = md5($_POST[password]);
05  
06$r=mysql_query("SELECT * FROM tbl_user WHERE username='$username' and password='$password'");
07 
08$jml_row = mysql_num_rows($r);
09$d=mysql_fetch_array($r);
10 
11if($jml_row >0 && ($d[password]==$password)){
12     echo "Login Sukses";
13}
14else{
15     echo "Login Gagal";
16}
17 
18?>
Nah, demikian tips yang dapat saya sampaikan pada posting kali ini dengan judul Teknik Mencegah SQL Injection pada PHP. Mungkin dapat Anda terapkan dalam sistem yang Anda bangun dan semoga bermanfaat bagi kita semua.

Tidak ada komentar: