Dapatkan 'Easy Gammu Installer' - Cara Mudah Install Gammu + Ebook Gammu
Ingin Punya Script SMS Gateway dengan PHP + MySQL?

Dapatkan segera phpSMS V3.0, software SMS Gateway multi fungsi berbasis web buatan saya sendiri untuk keperluan Anda.
[Info Lengkap...]

Teknik Scripting Mencegah SQL Injection di PHP


March 14th, 2009 | by rosihanari | Cetak Artikel Ini 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.

VN:F [1.9.4_1102]
Rating: 5.3/10 (3 votes cast)
Teknik Scripting Mencegah SQL Injection di PHP, 5.3 out of 10 based on 3 ratings
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


Share this article on:

Kata kunci: PHP - security - sql injection -


Ada 28 komentar dalam artikel ini.

  1. rosid says:

    heeee

    matur nuwun mas tutoriale…

  2. xmal says:

    mo nanya nih mas..
    Script seperti diatas naruhnya dimana?
    cz ak mo coba bantu website sekolahku yang kena hack.

    sory masih newbie..

  3. ignaz says:

    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….

  4. aris yohanes says:

    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

  5. rosihanari says:

    to aris yohanes: wah.. keren… thanks banget atas tambahannya. so… cool.. mudah-mudahan bermanfaat.

  6. heru says:

    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

  7. rosihanari says:

    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.

  8. heru says:

    ada yang lebih nekat klik disini

    Berani banget buat variabel kayak gthu.

  9. rosihanari says:

    to heru: wah.. gila.. berani amat yah…

  10. heru says:

    wah kayaknya pak dosen harus ngasi tutor buat clean url nih :D

  11. [...] 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 [...]

  12. detnot says:

    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

  13. rosihanari says:

    to detnot: pada script Anda, terutama bagian $id = $_GET['id']; tambahkan casting saja: $id = (int) $_GET['id'];

  14. detnot says:

    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

  15. rosihanari says:

    to detnot: coba baris $id=trim(mysql_escape_string($_GET['id'])); dihapus saja

  16. pandora says:

    Mas kl pake kaya gini masih ttp bisa di tembus g?

    $id = htmlspecialchars((int)$_GET['id']);

  17. rosihanari says:

    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.

  18. susi says:

    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..:)

  19. rosihanari says:

    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.

  20. susi says:

    Thanks ya mas Rosihanari..ternyata emang bisa.
    GBU

  21. doez says:

    ok thx infonya

  22. Tarji says:

    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

  23. rosihanari says:

    @tarji: bisa saja mas, ya tinggal apit perintah $_HTTP_POST_VARS() nya dengan abs(). Jadinya: $input_admin = abs($HTTP_POST_VARS['nama_admin']));

  24. 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

  25. 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….

  26. anto says:

    bagus… saya sangat terbantu dengan artikel d atas.. smoga bisa bermanfaat//

  27. ardie halim says:

    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

  28. elva says:

    makasih banyak mas atas informasinya, saya juga bingung mengatasi para hacker2 jail. sekali lagi makasi yah



Tolong beri komentar donk!

Komentar Anda akan berguna untuk kemajuan blog ini.


Mohon maaf, komentar yang menggunakan email palsu atau komentar bernada negatif atau cemooh secara otomatis akan terhapus karena dianggap spam dan tidak akan tampil dalam daftar komentar.

Dimohon jangan pula memasukkan code program dalam bentuk apapun ke dalam komentar karena akan dianggap spam.

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word