Archive for the ‘PHP’ Category

Input sanitizing on PHP

Banyak yang berkata “jangan pernah percaya kepada input dari pengguna” atau “don’t ever trust user input”, khususnya dalam dunia web programming dan developing. Kalimat itu tentu bukan sekedar kalimat biasa yang tidak ada artinya atau sekedar menjadi kata-kata mutiara tanpa penerapan. Dunia internet merupakan dunia yang sangat terbuka di mana setiap orang, mulai dari yang baik sampai yang memiliki rencana jahat bisa mengakses dunia yang kita buat di internet.

Walaupun ada banyak penyebab security di PHP dibobol oleh orang lain, akan tetapi penyebab yang paling utama dan sering terjadi adalah melalui user input. Padahal di sisi lain, user input dapat digolongkan sebagai tonggak suatu website dinamis. User input ini sendiri dapat berupa paramater dalam URL, form kiriman dari user, maupun alamat dari URL.

Jadi bagaimana kita harus menghadapi bahaya yang mungkin terjadi karena masalah user input? Jawabannya adalah dengan validasi dan pembersihan / sanitize terhadap input yang dikirimkan oleh user. Berikut ini hal-hal yang penting dalam melakukan validasi dan sanitizing terhadap user input.

(more…)

This entry was last modified on: November 8th, 2008 at 11:50

Array: The Power of PHP

Dari judul di atas, bisa ditarik kesimpulan bahwa entry ini akan berisi mengenai tipe data array yang terdapat di PHP. Bahkan dengan kata power yang ada di judul tersebut juga bisa dikatakan bahwa entry ini akan berisi seputar kegunaan, kelebihan dan keuntungan penggunaan tipe data array dalam PHP. Yep, bagi yang sudah pernah mengenal bahasa pemrograman lain seperti C atau Pascal atau Basic, sewaktu beralih atau belajar menggunakan PHP mungkin akan melihat perbedaan yang signifikan dalam arti array.

Array pada dasarnya merupakan suatu tipe data yang dapat menampung serangkaian tipe data yang sama dalam suatu variabel. Bila pada dasarnya kita mengenal tipe variabel seperti character atau char, integer atau int, dan float atau real, maka tipe data tersebut umumnya hanya dapat menampung sebuah data saja bila tidak menggunakan array. Ketika menggunakan array pun, banyak bahasa pemrograman yang menggunakan index atau key dalam array menggunakan angka bulat atau integer yang umumnya dimulai dari 0 (nol).

(more…)

This entry was last modified on: August 13th, 2008 at 1:31

Tag PHP, sepele tapi mematikan

No Comments PHP

Pernah mendengar berita mengenai seseorang yang digebukin sampai babak belur oleh tetangganya gara-gara suka melirik istri tetangganya tersebut? Atau mungkin seseorang babak belur karena suka menghidupkan mesin motornya keras-keras tanpa mengindahkan teguran tetangganya yang sudah berkali-kali dilayangkan kepadanya? Saya rasa ini berita yang ga terlalu asing lagi.

Kalau begitu apakah Anda pernah mendengar sebuah website atau proyek jadi babak belur gara-gara salah nulis tag yang ga bisa diterima oleh parser PHP? Yup, mungkin jarang mendengar, karena hal ini sendiri tergantung oleh konfigurasi pada parser yang ada.

Beberapa orang suka menuliskan <? sebagai tag pembuka PHP, tetapi orang lain terbiasa dengan <?php . Satu hal yang harus diperhatikan, biasakan menggunakan <?php. Alasannya bila konfigurasi PHP tidak memperbolehkan short tag seperti <? digunakan, maka babak belurlah proyek atau website yang Anad buat. Yap, hanya untuk alasan kompabilitas saja. Kalau Anda memang “buta” mengenai environment untuk server yang akan menjalankan script yang Anda buat, gunakan saja <?php dan jangan berkompromi soal itu.

Satu lagi alasannya, <? digunakan juga sebagai tag pembuka XML. Bila pada file php.ini Anda menggunakan short tag dan terdapat tag pembuka XML seperti di atas, tentu yang terjadi tidak akan selalu seperti yang diharapkan. Oke, sekali lagi saya katakan, “tidak akan selalu”, jadi yah mungkin saja masih bisa berjalan seperti yang Anda harapkan. :)

About XSS and CSRF

Dunia web-developing saat ini sudah berkembang sangat jauh dibanding masa dulu. Banyak aplikasi yang bagus yang terus dikembangkan untuk diimplementasikan melalui interface web. Banyaknya perkembangan dalam dunia web tidak hanya berdampak kepada end-user dan developer, tetapi juga oleh orang-orang yang jahat dan iseng untuk mengganggu kenyamanan orang lain selama menikmati dunia maya.

Beberapa waktu lalu saya sudah pernah menceritakan mengenai SQL Injection yang merupakan salah satu celah dalam pengembangan situs web. SQL Injection sendiri merupakan celah yang mengakibatkan penyusup dapat menyusupkan kode SQL ke server database yang ada.

Saat ini seringkali di dunia web-developing kita mendengar juga kata XSS dan CSRF. Sebenarnya apa yang dimaksud dengan XSS dan CSRF? Kita akan membahas satu persatu.

(more…)

This entry was last modified on: February 25th, 2009 at 14:07

SQL Injection

Di entry kali ini saya akan membahas sedikit mengenai SQL Injection yang merupakan salah satu istilah dalam dunia teknologi khususnya dalam teknologi database. Kebetulan hari ini saya mengikuti mata kuliah Sistem Basis Data atau yang lebih dikenal dengan Database dan saat itu ada yang bertanya mengenai SQL Injection ini.

SQL Injection merupakan salah satu masalah vulnerability dalam security dalam implementasi database. SQL sendiri merupakan singkatan dari Structured Query Languange. Artinya pengelolaan database dilakukan dengan mengirimkan perintah-perintah (queries) yang terstruktur dengan bahasa yang tersedia. Nah, SQL Injection yang secara harafiah berarti penyuntikan SQL memiliki artinya menyisipkan perintah atau query ke dalam query yang akan digunakan dalam database SQL.

Penggunaan SQL sebagai salah satu database management system turut mempopulerkan istilah SQL Injection ini dan menjadikan SQL Injection sebagai salah satu masalah keamanan yang cukup berbahaya bila tidak ditangani dengan serius. Apalagi penggunaan database dengan basis SQL seperti MySQL, Microsoft SQL Server, PostgreSQL cukup populer dibanding database lainnya.

SQL Injection umumnya terjadi karena ketidaktelitian programmer dalam membuat script yang akan dijadikan query SQL. Dan tentu saja hal ini bukan merupakan sesuatu yang mudah untuk dihilangkan karena setiap programmer memiliki tingkat ketelitiannya masing-masing saat membuat program.

Mari kita lihat contoh penerapan SQL Injection seperti di bawah. Perlu diketahui bahwa contoh yang saya gunakan adalah dengan bahasa pemrograman PHP dan database MySQL.

Seringkali ketika kita akan mengambil data dari database, kita akan menggunakan query seperti

"SELECT * FROM table_user WHERE username = '".$username."';"

Ketika user memasukkan data ke variable $username dengan nilai etersoul maka kode di atas akan berubah menjadi:

SELECT * FROM table_user WHERE username = 'etersoul';

Hasil di atas tampak tidak bermasalah dan dengan mudah sang programmer akan mendapatkan semua data mengenai seorang user dari table_user yang memiliki username = ‘etersoul’. Masalah akan timbul bila seorang hacker (atau user lain) yang mencoba untuk memasukkan nilai ' OR 1 = 1; -- ke dalam variabel $username. Maka hasil dari penggunaan variabel tersebut adalah:

SELECT * FROM table_user WHERE username = '' OR 1 = 1; --'

Query di atas akan mengambil semua data yang terdapat dalam table_user karena terdapat nilai 1 = 1 yang selalu bernilai true. Sedangkan penggunaan -- berguna agar kode setelah tanda tersebut dianggap sebagai komentar (comment) dan tidak dieksekusi oleh SQL. Seorang hacker bisa saja menggunakan data yang telah didapat di atas untuk keperluan yang buruk misalnya menggunakan account user karena password telah diketahui (walau pada kenyataannya saat ini kebanyakan password telah dienkripsi atau diacak sebelum dimasukkan ke database).

Bila contoh di atas tidak cukup, mari kita coba menggunakan '; DROP TABLE table_user; -- sehingga menjadi:

SELECT * FROM table_user WHERE username = ''; DROP TABLE table_user; --'

Setelah query tersebut dieksekusi, maka hilanglah tabel table_user dari database Anda, kecuali Anda memiliki backup atas table itu.

Lalu bagaimana cara mencegah terjadinya SQL Injection ini? Cara yang dapat dilakukan cukup mudah. Di PHP sendiri disediakan fungsi mysql_real_escape_string() yang dapat digunakan untuk “membersihkan” (sanitize) string dengan melakukan escape atau perubahan terhadap karakter-karakter tertentu, misalnya karakter \ menjadi \\, ” menjadi \” sehingga tidak terjadi salah “asumsi” oleh SQL. Sedangkan untuk melakukan sanitize terhadap integer dapat digunakan fungsi intval(). Untuk float dapat digunakan floatval(). Sekarang mari kita lihat kode hacker di atas setelah di-sanitize dengan mysql_real_escape_string($username);

SELECT * FROM table_user WHERE username = '\' OR 1 = 1; --'

atau

SELECT * FROM table_user WHERE username = '\'; DROP TABLE table_user; --'

Yah, sekarang tanda ‘ telah di-escape menjadi \’ sehingga SQL tidak akan menganggap tanda kutip tersebut sebagai bagian dari perintah SQL untuk menutup tanda kutip sebelumnya, melainkan sebagai sebuah karakter.

Untuk bahasa pemrograman lainnya umumnya telah disediakan juga fungsi untuk melakukan escape terhadap string (umumnya fungsi tersebut menggunakan kata escape). Dalam PHP sendiri dapat digunakan mysql_escape_string(), akan tetapi fungsi ini tidak disarankan untuk digunakan karena tidak melakukan escape terhadap beberapa jenis karakter.

Yah, itulah sedikit penjelasan mengenai SQL Injection. Semoga hal ini dapat membantu Anda dalam membuat program yang baik dan aman. ;)

— Code is poetry —

This entry was last modified on: March 26th, 2008 at 17:37

Search Engine Optimization URL (Code)

No Comments PHP

Beberapa hari yang lalu sudah dijelaskan tentang apa itu Search Engine Optimization secara umum. Sebagai tambahan adalah bahwa SEO URL ini sering juga disebut sebagai Clean URL atau Friendly URL.

Sekarang dalam entry blog yang ini, saya akan membahas bagaimana cara memproses URL yang dimasukkan agar dapat diproses menjadi suatu halaman.

Pertama-tama, requirement yang diperlukan dalam membuat SEO URL adalah :

  1. Web-server Apache dengan modul Rewrite
  2. PHP
  3. File yang akan dialihkan dengan rewrite.

Setelah semua hal itu dipenuhi, maka yang harus dilakukan pertama-tama adalah membuat file .htaccess di root folder untuk mengalihkan semua URL yang dimasukkan ke dalam suatu file, misalnya index.php. Web-server Apache cukup pintar untuk membedakan URL yang harus dialihkan dengan URL sebuah file yang exists atau tidak perlu dialihkan. Berikut ini contoh dari .htaccess yang akan mengalihkan semua URL ke index.php

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Dari file tersebut bisa dilihat bahwa RewriteEngine dinyalakan. Kemudian RewriteBase untuk menandakan URL yang akan di-rewrite tersebut dimulai dari “/” atau root folder yang sama dengan .htaccess tersebut. Hal ini berarti semua URL yang di-request akan di-rewrite. Bila RewriteBase berisi “/folder/” maka hanya URL yang mengandung “/folder/” saja yang akan direwrite, misalnya URL “http://www.example.com/folder/test/”. Akan tetapi tidak untuk “http://www.example.com./test/page-1/”.

Kemudian RewriteCond berfungsi untuk membuat sebuah kondisi untuk rewrite. Dalam kasus tersebut, kondisi yang dicek adalah apakah URL yang di-request bukan file yang exists atau folder yang exists. Bila syarat tersebut terpenuhi, maka akan dilakukan rewrite sesuai dengan RewriteRule yang dalam contoh di atas menulis semua request ke file index.php yang terdapat di root folder.

Mengenai module rewrite ini dapat dilihat secara lengkap di http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

Setelah membuat file .htaccess, yang harus dilakukan berikutnya adalah membuat file index.php yang merupakan file yang akan memproses seluruh request yang dialihkan. Di dalam file ini harus dilakukan beberapa hal yaitu mengolah URL yang di-request, memecah request URL ke dalam beberapa bagian, misalnya domain, bagian 1, bagian 2, bagian 3, dan seterusnya yang dapat dilakukan melalui fungsi explode melalui PHP dan dipisahkan dengan tanda slash “/”. Bagian-bagian inilah yang akan diproses untuk menentukan halaman yang akan ditampilkan.

Itulah beberapa hal yang dapat saya jelaskan untuk membantu pembuatan sebuah situs dengan SEO. Semoga membantu.

This entry was last modified on: January 29th, 2008 at 20:29

Randomize avatar

Tadi siang sempat liat-liat forum komunitas MyBB dan di sono ketemu ama member yang pake avatar yang bisa di-random. Jadi hari ini saya coba untuk membuat kode random avatar dari PHP. Lewat blog ini saya juga akan mengajarkan sedikit mengenai avatar random ini. ;)

Perlu diketahui bahwa untuk dapat menggunakan avatar random ini, paling tidak harus memenuhi beberapa hal berikut:

  • Hosting dengan support PHP dan Apache
  • Gambar-gambar yang akan digunakan dalam format PNG

Umumnya agak sulit untuk menemukan hosting gratis yang menyediakan PHP, jadi salah satu caranya adalah menyewa hosting dari sebuah perusahaan hosting. Kemudian saya menggunakan PNG karena memiliki kualitas kompresi yang baik serta tidak mengurangi kualitas ketika diproses ke dalam kode PHP.

Pertama-tama saya membuat avatarnya menggunakan Macromedia Fireworks. Simpel aja sih, jadi ga usah dibikin ribet. :p Semua file yang telah dibuat di-upload di suatu folder di hosting yang dipakai (misalnya folder avatar).

Kemudian buat kode PHP seperti di bawah :

<?php
$dir = "./";
$avatarimg = array();

// fetch the image file
if($imagedir = @opendir($dir))
{
while($imagefile = readdir($imagedir))
{
if(get_extension($imagefile) == 'png')
{
$avatarimg[] = $imagefile;
}
}
}

// count the number of file
$randomimg = rand(0, count($avatarimg)-1);

// start processing image using GD
$im = @imagecreatefrompng($avatarimg[$randomimg]);

if($im)
{
$color = imagecolorallocate($im, 0, 0, 0);
// create rectangel box around the image
imagerectangle($im, 0, 0, 99, 99, $color);
header("Content-type: image/png");
imagepng($im);
imagedestroy($im);
}

function get_extension($file)
{
$array = explode('.', $file);
$int = count($array);
return $array[$int-1];
}
?>

Simpan file tersebut menjadi index.php kemudian gabungkan bersama folder yang terdapat gambar-gambar yang telah disediakan tersebut.

Sekarang untuk mencoba, anda dapat membuka folder index.php atau folder tersebut. Misalnya folder tersebut berada di http://www.example.com/avatar/, maka anda dapat mencoba untuk membuka http://www.example.com/avatar/ atau http://www.example.com/avatar/index.php. Anda juga dapat memasukkan URL tersebut di forum-forum yang mensupport avatar external. Dengan sedikit editing, kode tersebut juga dapat digunakan untuk membuat gambar random atau gambar signature secara random.

Selamat mencoba.

Note : Hasil koding saya dapat dilihat di http://forum.smabhk.com/member.php?action=profile&uid=1 atau di http://www.etersoul.com/avatar/.

This entry was last modified on: July 8th, 2007 at 0:49