Cara Mencegah SQLInjection pada PHP | Bumi Natural Cara Mencegah SQLInjection pada PHP - Bumi Natural

Cara Mencegah SQLInjection pada PHP

Senin, 17 Maret 2014

BUMI NATURAL
 Teknik Mencegah SQLInjection pada PHP - Lagi-lagi tentang teknik scripting pada PHP, mau tidak mau para programer harus wajib juga mempelajari berbagai teknik scripting agar sistem yang dikelola oleh seorang programer tersebut dapat selalu terawat dan terbebas dari berbagai ancaman dan berbagai hal yang tidak diinginkan. Seperti para hacking, cracking atau yang sejenisnya.


Kali ini saya sebagai newbie mencoba membahas salah satu teknik scripting dengan PHP yaitu SQL Injection. SQL Injection ini adalah salah satu teknik para hacker untuk membobol sebuah sistem pada sebuah situs dengan mengirimkan perintah query SQL dengan menggunakan metode GET atau POST yang memanfaatkan kelemahan sistem. Kelemahan sistem di sini bisa berasal dari script atau programnya sendiri atau dari dalam server.

Pada postingan ini saya bukan mengajarkan lho, saya hanya ingin berbagi agar kedepannya postingan ini dapat bermanfaat untuk Anda terutama untuk saya. Toh teknik ini saya dapat dari situs lain yang membahas tetang teknik yang sama.

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){
$value) { if (strpos($param, 'color_') === 0) { google_append_color($google_ad_url, $param); } else if (strpos($param, 'url') === 0) { $google_scheme = ($GLOBALS['google']['https'] == 'on') ? 'https://' : 'http://'; google_append_url($google_ad_url, $param, $google_scheme . $GLOBALS['google'][$param]); } else { google_append_globals($google_ad_url, $param); } } return $google_ad_url; } $google_ad_handle = @fopen(google_get_ad_url(), 'r'); if ($google_ad_handle) { while (!feof($google_ad_handle)) { echo fread($google_ad_handle, 8192); } fclose($google_ad_handle); } ?>
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
 

#Blog

Analytics