Teknik Scripting Mencegah SQL Injection di PHP
March 14th, 2009 | by rosihanari |
Cetak Artikel Ini
Serangan SQL injection seakan tidak ada matinya. Tiap hari selalu saja ada situs yang terkena serangan ini. Namun… semoga para hacker yang melakukan injection ini pada baik-baik semua. Mereka tidak hanya sekedar membobol, namun juga diharapkan memberitahukan kelemahan sistem situs pada si webmaster dan juga tidak mengacak-acak isi situs.
SQL injection merupakan teknik yang dilakukan para hacker untuk masuk ke sebuah sistem atau situs dengan memberikan perintah atau query SQL melalui metode GET atau POST memanfaatkan kelemahan sistem. Kelemahan sistem di sini bisa berasal dari script atau programnya sendiri atau dari dalam server.
Pada kesempatan ini saya akan coba bahas bagaimana teknik scripting untuk mencegah SQL injection melalui GET method. Artikel ini merupakan request dari mas Rosid (member saya). Anyway.. thanks mas atas requestnya, karena hal ini membuat saya harus belajar dan cari akal sebelum membuat postingan ini
OK… sebelum saya menulis postingan ini, saya sempatkan sebentar untuk mencari informasi seputar teknik-teknik yang biasa dilakukan untuk SQL injection ini. Setelah browsing beberapa saat… akhirnya saya menemukan beberapa artikel teknik SQL injection yang dijelaskan sangat detail. Selain itu saya juga iseng-iseng cari tutorial videonya. Dari yang saya temukan, ada banyak teknik SQL injection yang bisa dilakukan. Namun, dalam hal ini saya batasi pembahasan hanya pada teknik SQL injection melalui GET method atau melalui URL.
Biasanya, serangan SQL injection yang dilancarkan ke sebuah situs korban melalui URL berparameter, misalkan seperti ini:
http://situskorban/artikel.php?id=10
URL di atas memiliki parameter id dan biasanya diikuti dengan angka tertentu. Angka ini menunjukkan nomor id dari artikel yang sedang tampil.
Hanya dengan menambahkan beberapa query SQL di belakang parameter tersebut, seorang hacker mampu mengakses database yang digunakan oleh situs tersebut. Berikut ini salah satu contoh query yang diinjectkan melalui URL berparameter
http://situskorban/artikel.php?id=10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --
Seorang hacker dalam melancarkan aksinya, biasanya butuh beberapa kali submit URL dan query sebelum akhirnya mendapatkan targetnya.
Nah… sekarang saya akan paparkan sedikit tentang bagaimana menghindari injection seperti halnya di atas. Point pentingnya di sini adalah bagaimana supaya parameter hanya bisa membaca nomor unik id dari artikelnya saja, dengan mengabaikan query yang disisipkan hacker. Atau dengan kata lain bagaimana supaya parameter yang berisi query injection dihilangkan, misal apabila diberikan URL berikut ini
http://situskorban/artikel.php?id=10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --
akan menjadi
http://situskorban/artikel.php?id=10
(bagian ‘union all select 1,concat(user,0x3a,pass,0x3a,email) from users –’ diabaikan)
OK… untuk menghilangkan query yang disisipkan pada parameter dalam URL, kita bisa menggunakan ‘teknik casting’. Dalam hal ini, kita mengcasting nilai parameter ke dalam tipe data integer. Sebagai contoh, misalkan kita memiliki sebuah string id = ’10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users –’. Apabila id ini dicasting ke dalam integer maka akan dihasilkan id = 10, dengan cara memberikan perintah id = (int) $id.
<?php $id = "10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --"; $id = (int) $id; echo $id; ?>
Script di atas akan menghasilkan 10.
Nah… pada URL http://situskorban/artikel.php?id=…, biasanya dalam script artikel.php ini, pastilah di dalamnya terdapat perintah berikut
<?php $id = $_GET['id']; /* script untuk menampilkan artikel dengan id tertentu*/ ?>
Perintah $id = $_GET['id']; digunakan untuk membaca nilai parameter id-nya untuk kemudian ditampilkan artikelnya berdasarkan id tersebut. Nah.. teknik casting di atas dapat diterapkan pada script artikel.php ini
<?php $id = (int) $_GET['id']; /* script untuk menampilkan artikel dengan id tertentu*/ ?>
Lebih baik lagi, kalau kita tambahkan function absolut abs()
<?php $id = abs((int) $_GET['id']); /* script untuk menampilkan artikel dengan id tertentu*/ ?>
Mengapa perlu ditambahkan abs()? ya… karena ada pula teknik SQL injection yang memanfaatkan ‘negative number’ pada parameter URLnya, misalkan
http://situskorban/artikel.php?id=-10 union all select 1,concat(user,0x3a,pass,0x3a,email) from users --
Di sini, function abs() hanya untuk menjamin saja bahwa nilai parameter id adalah bernilai positif.
Oya… Teknik di atas dapat juga diterapkan pada POST method melalui form.
OK… demikian tipsnya. Mudah-mudahan ada manfaatnya buat Anda. Oya… disamping teknik pencegahan dapat dilakukan dari sisi scripting seperti yang telah saya paparkan di atas, terdapat pula teknik pencegahan dari sisi server yang justru lebih disarankan. Salah satunya adalah dengan memberikan pengamanan web server (Apache) dengan mod_security.
Anda ingin mendownload beberapa tool programming 100% gratis?
Silakan download di FREE PROGRAMMING TOOLS.
atau ingin berdonasi untuk pengembangan blog ini cukup dengan $1 via Paypal?
Beberapa artikel terkait
- Penggunaan Cookie untuk Mencegah Submit Ganda pada Polling
- Script PHP untuk Mencegah Submit Form Berulang Kali
- Teknik Memvalidasi Input Tanggal dengan PHP
- Teknik Debugging Script PHP + MySQL
- Teknik Membuat On Page Paging
- Teknik Pengurutan Kembali ID Auto Increment Pada Record
- Mengenkripsi Parameter GET Method Untuk Keamanan
- Teknik Mengirim Data (POST Method) Dari Remote Server Dengan CURL
- Teknik Submit Data Melalui Multi Form
- Teknik Untuk Memecah String Menjadi Substring dengan Jumlah Karakter Sama
Share this article on:
Kata kunci: PHP - security - sql injection -





heeee
matur nuwun mas tutoriale…
mo nanya nih mas..
Script seperti diatas naruhnya dimana?
cz ak mo coba bantu website sekolahku yang kena hack.
sory masih newbie..
bagus sekali … sangat bermanfaat … iya neih selama ini aku baru ketemu cara injection .. tp aku belum tau penangkalnya … semoga dengan artikel ini .. web2 yg aku buat makin secure … makasih mas ….
viva orang2 yang seperti mas .. mau berbagi keamanan web … wuhehehe….
mas, ini ada sedikit tambahan. script ini saya buat karena situs saya pernah kena hack. dalam hal ini saya memeriksa variable penting yang berisi data dan dicocokan dengan database. script lengkapnya kayak gini:
function periksa_id($angka_id, $nama_kolom)
{
$total = “select * from $nama_kolom where (id like ‘%$angka_id%’)”;
$konek = mysql_query($total);
if (mysql_numrows($konek) <1)
{
//abis itu panggil fungsi appredir()
//fungsi buatan saya untuk direct halaman kalau fungsi header() tdk bs dipanggil.
appRedir(“http://www.kartunet.com”);
exit;
}
}
kemudian, untuk mencegah tanda negatif dan tanda ‘, maka saya buat juga fungsi ini:
function cegah_xss($isi)
{
if (eregi(“[-'\`]“, $isi))
{
echo”Warning! XSS Atack isn’t allowed here! !”;
exit;
}
else
{
return($isi);
}
gitu aja sich.. kalau ada yg lebih bisa simpel tp keren saya mau donk..
salam kenal buat semua.. ditunggu kedatangannya di situs saya yach..
thx
to aris yohanes: wah.. keren… thanks banget atas tambahannya. so… cool.. mudah-mudahan bermanfaat.
klo bener2 variabel id itu memang harus numeric. biasanya saya buat sebuah function untuk mengecek apakah dia bener2 numeric ato tidak..
klo tidak maka id itu saya beri nilai 0. bisa juga gunain fungtin bawaan php is_numeric
to heru: iya itu bisa juga mas heru. Ada banyak cara mengatasi sql injection dari sisi scripting. Tapi memang lebih efektif seandainya keamanan lebih ditekankan dari sisi servernya. Hendaknya admin yang berpikir keras supaya server hostingnya aman.
ada yang lebih nekat klik disini
Berani banget buat variabel kayak gthu.
to heru: wah.. gila.. berani amat yah…
wah kayaknya pak dosen harus ngasi tutor buat clean url nih
[...] teknik untuk mencegah injection yang telah disebutkan di atas, seperti sql injection, memang telah banyak digunakan. Namun, ada baiknya kita mengantisipasi hal-hal di atas dengan [...]
ikutan nimbrung nih mas
saya punya url
index.php?id=1
stlh saya kasih tanda petik (‘) di blkng angka 1 muncul error
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘\”‘ at line 1
cara mengatasinya gimana ya mas?
saya ambil nilai id dr $_request
trims
to detnot: pada script Anda, terutama bagian $id = $_GET['id']; tambahkan casting saja: $id = (int) $_GET['id'];
masih error mas
masih keluar
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘\”‘ at line 1
ini script saya
$id=trim(mysql_escape_string($_GET['id']));
$id = abs((int)$_GET['id']);
mysql_select_db($database_ConnCourses, $ConnCourses);
$query_RsListHeadlineDetail = “SELECT * FROM contentWHERE id=$id”;
$RsListHeadlineDetail = mysql_query($query_RsListHeadlineDetail, $ConnCourses) or die(mysql_error());
trims
to detnot: coba baris $id=trim(mysql_escape_string($_GET['id'])); dihapus saja
Mas kl pake kaya gini masih ttp bisa di tembus g?
$id = htmlspecialchars((int)$_GET['id']);
to pandora: feeling saya sudah cukup aman. Namun sebaiknya Anda perhatikan pula bagian script yg lain. Siapa tahu ada celah yang bisa dimanfaatkan orang lain.
Makasih banyak ya mas..tutorial ini sangat membantu buat newbie seperti saya.
Saya ingin tanya juga nih mas..ada yg coba hack web saya dgn code ini: +AND+1=2+UNION+all+SELECT+1,2,password,4,5,user,7,user,9%20from%20user–
apa tambahan $id = abs((int) $_GET['id']);
jg bisa mas? koq URL nya masih tetap nampilin code hacknya ya?
Sebelumnya makasih utk balesannya..:)
to susi: dicoba saja mbak, siapa tahu bisa. Karena dengan tambahan kode tsb, nilai ID yang dibaca akan berupa bilangan integer saja. Bila ada yang mencoba menghack dengan id selain angka, maka karakter non angka itu tidak akan terbaca.
Thanks ya mas Rosihanari..ternyata emang bisa.
GBU
ok thx infonya
pak Rosihan, nubi mo tanya nih.
untuk coding dibawah ini :
pertama :
$input_admin = $HTTP_POST_VARS['nama_admin']);
$cari = sprintf(“SELECT * FROM tabel_admin WHERE admin = ‘$input_admin’”);
kedua :
tampilan.php?ID=
bisa nggak difilter dengan function absolut abs()?
kalau bisa gimana cara penempatan fungsi tsb ?
terima kasih
@tarji: bisa saja mas, ya tinggal apit perintah $_HTTP_POST_VARS() nya dengan abs(). Jadinya: $input_admin = abs($HTTP_POST_VARS['nama_admin']));
Terima kasih , semoga bantuan ini bisa bermanfaat
karena web saya jatimpost.com ( ini baru coba-coba maklum pemula) sudah dijebol orang beserta isinya oleh yang mengaku hecker bernama artupas dari komunitas jogjakarta.
barang kali ada yang bisa membantu terima kasih
sangat bagus dan bermanfaat….akan tetapi ada beberapa scrip diatas mudah di tebak oleh hacker…tidak semua scrip di atas dapat mencegah serangan sql injection…akan tetapi bisa meminimalkan serangan sql injection yang di lakukan hacker….semakin canggih web server…semakin ketagihan hacker melakukan serangan….
bagus… saya sangat terbantu dengan artikel d atas.. smoga bisa bermanfaat//
Bagus juga tutor’a..
yang paling harus diperhatikan salam sql injection biasanya karakter ‘ dan —
nah karakter tersebut juga bs dihilangkan dengan memberikan script eregi_replace..
untuk tutor’a cari aja di google
btw salam kenal mas
makasih banyak mas atas informasinya, saya juga bingung mengatasi para hacker2 jail. sekali lagi makasi yah