Pencarian

Sabtu, 18 April 2009

Meminimalisasi Serangan Sql Injection

Setelah beberapa minggu ini belajar Sql Injection, maka kali ini saya mau buat Script sederhana untuk meminimalisasikan serangan tersebut.

Sebelumnya perlu diketahui,
Sql Injection adalah Serangan dengan cara memasukkan perintah ke Query Sql dengan cara memanipulasi data yang sebenarnya, cara memasukkannya bisa melalui URL atau input text. Bug ini memang sudah lama banget beredarnya kalo nggak salah sekitar tahun 2002 (klasik) namun kamu masih dapat menemukan banyak bug ini pada website-website di penjuru internet ini, terutama website pemerintah :D

Untuk mengetahui apakah website calon memiliki Vuln (bisa di injec) atau tidak, biasanya penyerang memasukkan tanda kutip satu (') pada url nya. misalnya terdapat alamat ini:
http://www.bedolzz.com/index.php?id=10'
atau bisa juga dengan (-)
http://www.bedolzz.com/index.php?id=-10
bila terdapat error maka ada kemungkinan website tersebut Vulner atau bisa di serang dengan teknik SQL Injection.
Untuk mengatasi hal diatas, maka kita bisa membuat Script diatas:

Untuk nilai variabel $id saya menggunakan digit angka, karena dengan angka akan memudahkan saya dalam proses pengecekkan, Scriptnya seperti ini:

<?php
error_reporting(0);
include "koneksi.php";
class filter{
function sqlInjection($id){
$id2 = mysql_real_escape_string($id);
if (!ctype_digit($id2))
{
echo "Maaf, Bug nya udah di patch";
exit;
}
else if ($id2 <= 0)
{
echo "Yah di patch lagi ";
exit;
}
else
{
return $id;
}
}
}
$oFilter = new filter();
$id = htmlentities($_GET['id']);
$cId = $oFilter->sqlInjection($id);
$q = mysql_query("select *from guestbook where id_guest='$cId' order by id_guest desc") or die (mysql_error());
if (mysql_num_rows($q) == 0)
{
echo "Data nya nggak ada";
exit;
}
$a=mysql_fetch_assoc($q);
echo "Nama : $a[username]<br>";
echo "Email : $a[email]<br>";
echo "Komentar : $a[comment]<br>";
echo "<br><hr>";
?>

Penjelasan :
error_reporting(0): berguna Untuk mematikkan pesan error pada saat ada kondisi error.
mysql_real_escape_string : berguna untuk manambahkan slash (\) jika terdapat tanda kutip.
ctype_digit : berguna untuk mengecek apakah input tersebut berupa angka atau bukan.
setelah itu saya buat kondisi dimana id nya nggak boleh kecil atau sama dengan 0
Selesai dah..

Sedangkan untuk menghindari SQL Injection di halaman login saya menggunakan Fungsi-fungsi seperti: Fungsi strip_tags, htmlentities, mysql_real_escape_string dan eregi untuk mencocokkan karakternya.
Setelah selesai di cek dengan fungsi tersebut baru data saya masukkan ke Query. o ya, jangan lupa pake encrypt md5() biar lebih aman.

SELECT * from tb_user where username='$username' and password=md5('$password')

Koq proses pengecekkannya banyak nih ???
Saya pernah membaca buku karangan S'to dari Jasakom mengenai Sql Injection
katanya " Jangan pernah percaya semua input yang berasal dari user"
dan seperti memang harus seperti itu :D

Seperti yang saya bilang di atas, Script yang saya buat tentunya belum banyak validasi dan masih rentan terhadap serangan makanya saya bilang meminimalisasi bukan menghindari, dan jangan lupa ya kasi tau jika ada cara yang lebih bagus lagi... :D

Keep Share...

Tidak ada komentar:

Posting Komentar