PHP : Teknik atau Cara Sederhana untuk Mencegah SQL Injection - Elang Sakti
Download Ebook Belajar Arduino PDF, Arduino untuk pemula
Jasa Pembuatan Program Arduino, pemrograman Arduino
# Hack Your Skills! to be Professional Mechatronics

PHP : Teknik atau Cara Sederhana untuk Mencegah SQL Injection

4 komentar
Teknik serangan SQL Injection merupakan serangan injeksi perintah SQL pada bagian URL atau bagian Body HTTP Request. Pada bagian URL, bisa kita lakukan langsung dengan memodifikasi kotak URL di browser. Sedangkan untuk injeksi di bagian body, ini biasa dilakukan ketika kita mengisi form. Seperti form login, form pencarian, form pendaftaran, atau form-form lainnya. Tutorial tentang teknik SQL Injection bisa temen-temen pelajari di Belajar Teknik SQL Injection, XSS, LFI, dan RFI beserta Contohnya.

Untuk mencegah serangan SQL Injection ini, kita bisa melakukan filtering pada data yang diinputkan user. Kata pepatah, "Jangan pernah percaya pada user di internet!". Sehingga setiap inputan dan apa saja yang diinputkan user harus kita filter terlebih dahulu. Menurut hemat saya, ada dua jenis data yang perlu kita filter, yaitu inputan yang berupa angka dan string (campuran angka, huruf, dan metakarakter). Oke, kita langsung ke script untuk memfilter angka:

$id = $_GET['id']; // ambil nilai dari parameter 'id'
if(!is_numeric($id)){ // kalau isi dari variabel 'id' bukan angka
  $id = 0;  // berikan nilai default, yaitu $id = 0;
}

// proses SQL

Jika parameter adalah angka, maka solusinya setiap inputan difilter dengan is_numeric(). Parameter yang berupa angka biasanya digunakan untuk menampilkan halaman berdasarkan id tertentu yang ada dalam database. Seperti artikel, gambar, data profil, dan lain-lain. Contoh URL yang menggunakan parameter angka yaitu:
www.web.com/index.php?id=32
www.web.com/index.php?kode=1024
www.web.com/index.php?page=9

Pada contoh URL di atas, parameter id, kode, dan page itulah yang akan kita filter berdasarkan angka karena nilainya berupa angka (32, 1024, 9). Akan tetapi, jika nilainya ada kemungkinan bukan angka, misal index.php?page=home, maka teknik yang kita gunakan adalah teknik yang berikutnya yaitu dengan memfilter string.
www.web.com/index.php?message=Page Not Found
www.web.com/index.php?result=Success
www.web.com/index.php?page=home
www.web.com/index.php?nama=Ahmad&komentar=Selamat menunaikan ibadah belajar

Jika parameter adalah campuran (string, angka, metakarakter), maka solusinya kita filter dengan htmlentities($string,ENT_QUOTES,'WINDOWS-1252'). Penggunaan htmlentities ini berbeda dengan htmlentities yang biasa, yaitu htmlentities($string). htmlentities yang biasa tidak mefilter singlequote dan doublequote, sedangkan htmlentities yang kami sarankan adalah mengaktifkan filter untuk singlequote dan double quote dengan memasukkan parameter ENT_QUOTES dan menggunakan karakter encoding WINDOWS-1252. Untuk masalah encoding tersebut, bisa dicek di Character Encoding Windows-1252.
$data = $_GET['data'];     // ambil string dari parameter 'data'
$data = htmlentities($data,ENT_QUOTES,'WINDOWS-1252'); // filter dengan karakter encoding

// proses SQL

Filter string tersebut juga bisa menangkis serangan Cross Site Scripting (XSS). Sebab script html atau javascript, akan diencode menjadi string biasa. Untuk contoh diatas, input data diambil dari URL, artinya pengiriman data masih menggunakan metode GET. Jika menggunakan metode POST, maka data akan dikirim di bagian body URL. Untuk bisa membedakan metode GET dan POST bisa baca Perbedaan GET dan POST Data pada PHP. Untuk metode POST biasanya digunakan untuk form login dan form isian data seperti nama, alamat, tanggal lahir dan sebagainya sehingga data yang diinputnkan merupaka data campuran. Data campuran tersebut bisa difilter dengan script berikut:
$id = null;
$data = null;
if(isset($_POST['id'])){ // kalau data dikirim dengan method POST
  $id = $_POST['id'];  // ambil data dengan method POST
  $data = $_POST['data'];
}else{    // jika tidak
  $id = $_GET['id'];  // ambil data dengan metode GET
  $data = $_GET['data'];
}

if(!is_numeric($id)){ // kalau isi dari variabel 'id' bukan angka
  $id = 0;   // berikan nilai default, yaitu $id = 0;
}

$data = htmlentities($data,ENT_QUOTES,'WINDOWS-1252'); // filter dengan karakter encoding

Semoga tulisan ini membantu. Bagi yang ingin bertanya, silakan isi di komentar ya.. :)


Written by Hari Santoso
PHP : Teknik atau Cara Sederhana untuk Mencegah SQL Injection
Bahasan: Teknik serangan SQL Injection merupakan serangan injeksi perintah SQL pada bagian URL atau bagian Body HTTP Request. Pada bagian URL, bi...
Published at Sabtu, 09 Maret 2013, Updated at Sabtu, 09 Maret 2013
Reviewed by dr. on
Rating: 4.7

4 komentar :

  1. Gan... jujur ane lagi ada masalah nih untuk sql blind injection, cuma tim it ane tdk menggunakan php tapi asp.net nah teknik untuk mencegahnya gimana ya gan, apa sama dengan ini. Thanks

    BalasHapus
    Balasan
    1. Makasih gan udah mampir. Kalo untuk ASP ane belum pengalaman, tapi inti dari SQL Injection sebenarnya adalah penyisipan perintah SQL di parameter. Jadi inputan Request["param"] harus diperiksa.

      Misal, jika ada tanda kutip tunggal, replace dengan kutip tunggal 2 kali. Misal inputannya pasti numerik / angka. Maka konvert dulu inputannya menjadi angka, seperti Convert.ToInt32(Request["ID"]). Jadi, intinya filter input data. Setelah diperbaiki/difilter, coba tes lagi dengan tool sql injection dengan aplikasi yang namanya havij, sql ninja, dll

      Hapus
  2. kalau numeric itu kan angka saja ,, kalau angka dan huruf di gabung berarti apa ???

    BalasHapus
    Balasan
    1. seperti di artikel bisa pake htmlentities($data,ENT_QUOTES,'WINDOWS-1252');

      Hapus