Tampilkan postingan dengan label Website. Tampilkan semua postingan
Tampilkan postingan dengan label Website. Tampilkan semua postingan

Selasa, 06 Oktober 2009

Algoritma dan teknik penangkal SQL injection



Tidak dipungkiri lagi, SQL injection adalah salah satu teknik hacking yg sangat berbahaya. Jika diamati, SQL injection berawal dari satu hal yg sebenarnya sangat sederhana sekali. Kali ini kita akan membahas teknik dan algoritma menangkal SQL injection yg dilakukan melalui methode $_GET.



Tulisan ini diawali kepada kesadaran bahwa atas banyaknya kasus SQL injection. Disamping sedikitnya kesadaran dari programmer dan kebingungan programmer untuk membenahi skripnya. Dikarenakan sedikitnya resource yg membahas bagaimana mencegah SQL injection. Sementara tips dan trik untuk melakukannya sangat banyak.



Mari kita lihat bersama: http://target.com/berita.php?task=detail&id=9

Pada kebanyakan aplikasi yg dibuat oleh programmer pemula, kode program pada berita.php adalah sebagai berikut



”.$data['judul'].””;

echo “Posting pada tanggal: “.$data['tanggal_posting'];

echo $data['isi'];

}

?>

Coba kita lihat lagi, betapa programmer, entah karena ketidak tahuan atau malas membenahi(nah ini yg susah) tidak memberikan filter pada input $_GET['id']. Padahal ini sangat berbahaya jika attacker mencoba melakukan teknik ini.



Disana ada 2 kesalahan fatal.

1. Tidak memberikan filter atas variable $_GET['id']. Sehingga MySQL Server akan memberikan signal kesalahan ke browser(Jika pada PHP error_message=ON).

2. Tidak melakukan checking terhadap hasil dari Query.



Lantas, bagaimana cara penanggulangannya. Cara mudahnya kita modifikasi skrip diatas seperti berikut ini:



validasi $_GET['id']

if(!ctype_digit($_GET['id'])){

die(””);

}

$sql = “SELECT * FROM berita WHERE id=”.$_GET['id'];

$result = mysql_query($sql);

// –> validasi hasil query

if(mysql_num_rows($result)<0){ data =" mysql_fetch_array()){" style="font-weight: normal;">”.$data['judul'].””;

echo “Posting pada tanggal: “.$data['tanggal_posting'];

echo $data['isi'];

}

} else { echo “Berita tidak ditemukan.”; }

?>

Nah, skrip diatas kira-kira mempunyai arti algoritma seperti ini:

1. Pertama-tama, validasi $_GET['id'], jika ia bernilai Integer(angka), maka lanjutkan. Jika tidak, tampilkan peringatan “Jangan coba-coba ya.” dan kembali kehalaman selanjutnya.

2. Lakukan Query

3. Cek hasil query. Jika hasil lebih besar dari 0(1,2,dst), ambil hasil query dan tampilkan ke layar browser. Jika tidak tampilkan pesan “Berita tidak ditemukan.”.



Nah, dengan begitu aplikasi kita sudah lumayan aman. Tunggu terus kelanjutannya ya.



Catatan: algoritma ini bisa dipakai tidak hanya pada PHP saja, tetapi bisa untuk bahasa pemrograman web yg lain. Tentu saja dengan syntax masing-masing. Untuk database selain MySQL tinggal mencari fungsi yg sama atau setara dengan fungsi-fungsi MySQL. (_zapto dikutip dari srandal.com)
Read more

Proteksi Dari SQL injection

Proteksi Dari SQL injection

Saya yakin Anda sudah banyak tahu tentang teknik SQL Injection dan sejenisnya. Tapi sebagian dari Anda mungkin masih bertanya-tanya bagaimana cara mengamankan program kita dari teknik SQL Injection ini ?

Sebenarnya banyak cara untuk menangkal teknik ini. Banyak programmer yang sudah membuat rekomendasi bagaimana menangkalnya. Bahkan para hacker juga telah melakukannya. Tinggal kita hendak memilih yang mana. Oh iya, jangan mengira bahwa teknik SQL Injection hanya terbatas pada form login. Sebenarnya teknik tersebut sangatlah luas. Tapi saya tidak akan membahas hal tersebut sekarang. Yang akan saya bahas adalah beberapa teknik untuk mengamankan SQL Injection. Oke, kita mulai !!

Secara umum ada 2 cara untuk menangani SQL Injection. Cara yang pertama adalah “memblokir karakter yang tidak lazim”. Berikut adalah contoh scriptnya :

$check1 = strstr($username,”\’”);
$check2 = strstr($password,”\’”);
if (($check1) or ($check2))
{
echo “Gagal masuk”;
}
else
{
echo “Berhasil masuk”;
}

Saya akan jelaskan script di atas. Mula-mula username dan password di-cek apakah terdapat karakter petik (‘). Jika terdapat karakter petik maka akan muncul pesan “Gagal masuk”. Jika tidak ditemukan karakter petik (‘) maka akan muncul pesan “Berhasil masuk”. Lalu ?? Bagaimana dengan teknik di atas ?. Permasalahannya adalah ada banyak karakter lain yang perlu di-blok selain karakter petik, misalnya karakter $, %, !, *, dan ratusan karakter lainnya. Semuanya harus di-blok satu-persatu. Agak repot bukan ?

Cara kedua untuk menangkal SQL Injection adalah “hanya mengizinkan karakter tertentu”. Ini adalah cara yang paling saya sukai dan direkomendasikan oleh para hacker. Berikut adalah contoh scriptnya :

if ((preg_match(”/^[a-zA-Z0-9 _]/”, $username))
and (preg_match(”/^[a-zA-Z0-9 _]/”, $password)))
{
echo “Berhasil masuk”;
}
else
{
echo “Gagal masuk”;
}

Script di atas saya dapatkan dari seorang hacker. Jadi berterimakasihlah kepada para hacker tersebut =). Saya akan jelaskan sedikit script tersebut. Username dan password akan di-cek apakah sesuai dengan format a-z, A-Z, 0-9, spasi ( ), dan underscore (_). Jika format sesuai maka muncul tulisan “Berhasil masuk”. Tetapi jika ada karakter di luar format tersebut maka akan muncul tulisan “Gagal masuk”.

Sebenarnya masih ada cara yang lain untuk menangani SQL Injection, seperti script berikut ini :

$username = htmlspecialchars($username);
$username = addslashes($username);

Beberapa programmer merekomendasikan script tersebut, tapi terus terang saya tidak begitu menyukainya. Sepertinya kurang efektif. Bagaimanapun, semuanya kembali kepada Anda, mau pilih yang mana silahkan.

Sekian …..

Sumber : Bang Leo

Link : Http://boleh-hacking.com

Read more