Memastikan input betul di dalam Perl

Posted by mkhairul

Library tersebut dihasilkan untuk memudahkan input yang diterima didalam kriteria tertentu (integer, alpha, alphanumeric, etc). Mungkin ada library yang telah pun wujud didalam CPAN, saya pun tak pasti tetapi saya tidak menjumpainya.

package input_lib;
use CGI::Carp "fatalsToBrowser";

@ISA = qw(Exporter);

@EXPORT = qw (
input_validate
);

my $required = 0;

sub input_validate{
    my ($value, $rules) = @_;

    use Data::Dumper;
	$required = 0;
	my @error_messages;

    my @rules = split('\|', $rules);
    foreach my $rule (@rules)
    {
        # Extract the rules and param (if there is a param)
        # e.g. max_length[5]
        @match = ($rule =~ m/(\w+)\[(\d+)\]{0,1}/g);
        if(!@match)
        {
            @match = ($rule =~ m/(\w+)/g);
        }
        my ($rule, $param);

        if(scalar(@match) > 1)
        {
            $rule = $match[0];
            $param = $match[1];
        }
        elsif(scalar(@match) > 0)
        {
            $rule = $match[0];
        }
        else
        {
            die("Error: No rule");
        }

        # Execute the rules
        # Call a subroutine dynamically
        # my $test = "alpha";
        # *{$test}{CODE}->(); // Calls the subroutine "alpha" i.e. alpha();

        if(!*{$rule}{CODE}->($value, $param))
        {
            push @error_messages, $rule;
        }
    }

    if($required == 0 && $value eq "")
    {
        return 0;
    }
    elsif(scalar(@error_messages))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

sub required{
    my ($value) = @_;
    $required = 1;
    return ($value) ? 1:0;
}

sub alpha{
    my ($value) = @_;
    return (($value =~ /^([a-z])+$/i)) ? 1:0;
}

sub alpha_space{
    my ($value) = @_;
    return (($value =~ /^([a-z\s])+$/i)) ? 1:0;
}

sub alpha_numeric{
    my ($value) = @_;
    return ($value =~ /^([a-z,0-9\s])+$/i) ? 1:0;
}

sub max_length{
    my ($value, $length) = @_;
    return (length($value) <= $length) ? 1:0;
}

sub min_length{
    my ($value, $length) = @_;
    return (length($value) >= $length) ? 1:0;
}

sub integer{
    my ($value) = @_;
    return (($value =~ /^[\-+]?[0-9]+$/)) ? 1:0;
}

sub valid_email{
    my ($value) = @_;
    return (($value =~ /^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix)) ? 1:0;
}

sub valid_time{
	my ($time) = @_;
	if(!($time =~ m/([0-9]{2})\:([0-9]{2})/)){ return 0; }

	my ($hour, $min) = split(/\:/, $time);
	if($hour eq "" or $min eq ""){ return 0; }
	if($hour > 23 or $hour < 0){ return 0; }
	if($min > 59 or $min < 0){ return 0; }

	return 1;
}

sub valid_date{
	my ($date) = @_; # receives dd/mm/yyyy

	my ($day, $month, $year) = split(/\//, $date);
	if($day eq ""){ return 0; }
	if($month eq "") { return 0; }
	if($year eq "") { return 0; }

	$date = $month . '/' . $day . '/' . $year;

        # taken from OWASP's regex repository, http://www.owasp.org/index.php/OWASP_Validation_Regex_Repository
	# regex only supports mm/dd/yyyy
	if(!($date =~ m/^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/))
	{ return 0; }

	return 1;
}

1;

Agak panjang, kan?
Ianya mudah digunakan cuma include didalam Perl script anda.

use input_lib;

if(input_validate($foo, 'required|integer')){ die("Sila masukkan integer sahaja"); }

Mungkin ada cara yang lebih baik? Jom sembang di bahagian komen.

Asas dan Pengenalan C++

Posted by mkhairul

E-buku yang disediakan oleh En. Najmi (teruskan usaha!) dan diuploadkan oleh beliau ke Scribd.
Asas dan Pengenalan C++ dalam Bahasa Melayu

Asas dan Pengenalan C++ dalam Bahasa Melayu_1258991179845

Saya pun tak berapa reti C++, maklumlah selama bekerja ni tak berpeluang nak guna.

Membasmi input-input durjana didalam Perl

Posted by mkhairul

Memandangkan saya banyak menggunakan Perl/CGI sejak kebelakangan ni, post ni adalah berkaitan dengan perl/cgi.

Terdapat pengaturcara yang memandang ringan aspek sekuriti dalam perisian (kebanyakannya tak tahu, ignorance is bliss, no?) dan mengabaikannya sehinggalah suatu hari dimana perisian tersebut perlu menembusi pasaran yang lebih besar dan perlu melalui proses “penetration testing” (singkatan pen test) yang akan merungkaikan segala kelemahan yang telah diabaikan selama ini didalam pembangunan perisian tersebut.

Apabila terjadi begitu, maka bermulalah operasi menampal perisian daripada lubang-lubang sekuriti tersebut. Bagi kebanyakan input daripada pengguna dalam Perl/CGI, menggunakan “placeholder” adalah mencukupi untuk menyimpannya dengan selamat dalam pangkalan data (database) mengelakkan daripada SQL Injection. Rujuk article di perlmonks untuk penerangan lanjut, Preventing SQL injection attacks: Placeholders are enough for MySQL, Postgresql and SQLite.

exploits_of_a_mom

Apa bendakah itu “placeholder”?
Placeholder adalah nilai yang digunakan untuk menggantikan sesuatu nilai yang lain.

Berikut adalah contoh penggunaan placeholder.

$sth = $dbh->prepare( "SELECT name WHERE city = ? AND state = ?" );
$sth->execute( $city, $state );

Dengan menggunakan placeholder, modul DBI akan secara automatik menguruskan isu-isu “quoting” (escape single/double quote, e.g. \”) didalam nilai yang dihantar kepada pangkalan data.

Kekurangan “placeholder”
Walaupun semua jenis input selamat dimasukkan kedalam database dengan menggunakan placeholder tanpa mengakibatkan SQL Injection, ia masih perlu diperiksa kesahihannya. Anda masih perlu untuk mengesahkan (validate) input yang dimasukkan samada ianya integer, numeric, alpha, alphanumeric, dsbnya.
Jika input tersebut adalah berbentuk HTML, tukarkan semua character ke dalam HTML Entities, untuk mengelakkan daripada kes-kes XSS (Cross-site Scripting). Jika tiada HTML dibenarkan, gunakan HTML::Scrubber untuk sental semua html daripada input tersebut.

Berikut adalah contoh untuk menukarkan character-character ke bentuk HTML Entity

use HTML::Entities;
sub html_to_db{
    my ($html) = @_;
	$html = encode_entities($html);
	$html =~ s/\r\n//gs;
	return $html;
}

Marilah kita sama sama belajar mempertahankan diri daripada anasir-anasir yang tak diingini apabila membangunkan perisian.

249141325_4913641b29

Selamat programming!

Contoh wiki yang menarik

Posted by mkhairul

Berikut adalah contoh-contoh wiki yang dihasilkan untuk memudahkan pembangunan sesebuah perisian.

Oleh kerana sekarang saya guna perl, saya cuba memperkenalkan Perl Coding Standard pada adik-adik fresh grad di syarikat sekarang ni dengan menulisnya didalam wiki untuk kegunaan semua developer.

Saya juga meluangkan masa untuk mengajar mereka yang ingin belajar memasukkan atau menyunting maklumat didalam wiki.

Code review juga adalah antara proses yang cuba saya perkenalkan tetapi agak terbantut untuk menerangkannya kerana terlalu banyak mindset yang berbeza untuk mengadaptasikan penjelesan saya.

Marilah berkongsi wiki-wiki menarik yang pernah anda gunakan (layari), kecuali wikipedia, harap maklum. :D

Berhutang didalam pembangunan perisian

Posted by mkhairul

Dah lama pula tak post. Berikut adalah berkenaan dengan Technical Debt.

Berhutang atau lebih dikenali sebagai “Technical Debt” adalah metafor yang direka oleh Ward Cunningham didalam aktiviti pembangunan perisian.

Terdapat 2 jenis hutang, iaitu ianya dilakukan dengan sengaja atau tidak sengaja. Sila baca pautan-pautan yang diberikan diatas untuk makluman lanjut.

Satu senario yang biasa saya jumpa adalah dimana..

Abu: “Aku rasa kita kena buat SOP atau guideline untuk setup environment development kita ni”
Ahmad: “Kita tak ada masa, kita kena siapkan feature-feature ni dalam bulan ni”
Abu: “Bukan kita kena fokus terus buat SOP atau guideline ni, setiap kali dimana antara kita setup, kita tulis langkah-langkah dia pastu kita try la kalau ada tak betul kita tambah dan perbaiki, bukannya nak kena formal pun. Nanti orang baru masuk kita bagi benda ni terus boleh buat sendiri.”
Ahmad: “Ok, ok takpe, nanti ada masa nanti kita buat”

Kemudian, ada orang baru masuk dan perlukan persekitaran pembangunannya disetup. Ahmad pergi tolong, setup IDE nya dan web server. Apabila nak setup perisian, dia menunjukkan cara pembangunan di tempat kerja itu, dan sampai satu tahap untuk run test (unit testing), ada yang gagal. Sambil menggaru kepala, dia cuba debug. Selepas 1 jam, dia panggil Aiman, rakan sekerja nya.

Ahmad: “Aiman, test ni fail la. Aku tak pasti apa masalah”
Aiman: “Ok, meh aku tengok”

Selepas 1 jam.

Aiman: “Aku pun tak tau. Jap aku gi cari Ali.”
Ali pun datang.
Ali: “Erm, jap aku test… Macam ni takleh.. oh korang lupa nak tukar setting kat config dia nih. Jap aku tukar.”
Ali: “Ok, settle.”
Lalu mereka pun pulang ke tempat masing-masing untuk sambung kerja mereka.

Nampak tak apa masalah kat sini? Macam mana kalau ada orang baru lagi masuk? Takkan sampai 3 orang kena datang untuk menyelesaikan masalah akar sebegini. Takde guideline untuk setup persekitaran pembangunan. Bukan terhad pada isu begini sahaja, macam macam lagi isu seperti tiada piawaian untuk mengkod (coding guideline), nota-nota penyelesaian yang bertulis (dalam word pun ok) yang boleh dikongsi bersama.

Sedar tak sedar, ini semua adalah hutang. Dimana kadar faedahnya bertambah hari demi hari dan jika tiada kesedaran untuk membayar “hutang” ini, akan membawa padah (dari segi mental ataupun kewangan).

Jadi, marilah kita bersama-sama sedari akan hutang-hutang yang mengelilingi pinggang kita dan membuat persiapan untuk membayarnya dengan menjadi lebih peka.

Selamat programming!

Perl 5.11 telah dikeluarkan (release)

Posted by mkhairul

Bagi sesiapa yang menggunakan perl, keluaran baru Perl, iaitu versi 5.11 kini boleh diperolehi. Ianya adalah ‘development release’ dimana pengguna perl boleh menggunakannya untuk menyesuaikan aplikasi-aplikasi ataupun skrip skrip supaya serasi dengan keluaran 5.12 yang akan datang.

Saya kini bekerja disyarikat yang menggunakan perl sebagai pelantar (platform) pembangunan aplikasi web, jadi perkembangannya harus saya ikuti untuk mengelakkan diri daripada terperangkap didalam jerangkap (pitfalls) didalam pembangunan perisian menggunakan perl.

Sumber:

Bersihkan input menggunakan Perl

Posted by mkhairul

Dalam pos ni, saya akan pos contoh kod untuk membersihkan input menggunakan perl. Mungkin ada module dalam CPAN yang dapat melakukannya tetapi saya tidak jumpa, mungkinkah ianya HTML::Scrubber? Saya pun tak pasti (dah lama tak buat perl).

Kod dibawah agak ringkas.

use HTML::Entities ();
use CGI qw/:standard/;

$query = new CGI;

$username	= $query -> param('username');
$password	= $query -> param('password');

$sql = qq~
	SELECT somefields
	FROM user
	WHERE username = ?
	AND password = ?
~;

$ok_chars = 'a-zA-Z0-9 ,-';
$c_username = HTML::Entities::decode( $username);
$c_username =~ s/[^$ok_chars]//go;

$dbquery = $conn->prepare($sqlstatement);
$dbquery->execute("$c_username", "$password" ) or &error("SQL&Couldn't execute statement: $DBI::errstr");

Jika ada cara lain, silalah kongsi! Terima kasih.

Pertandingan Pembangunan Aplikasi Web Sumber Terbuka 24 Jam di MyGOSSCON 2009

Posted by mkhairul

Terdapat pertandingan yang akan diadakan oleh Kerajaan Malaysia sempena MyGOSSCON 2009 (Malaysian Government Open Source Software Conference).

Keterangan lanjut boleh didapati pada laman web acara tersebut.

Nampak macam menarik, tetapi jika saya memasuki pertandingan tersebut, aplikasi yang dibina rasanya tidak secanggih mana, kerana saya akan banyak fokus pada kebolehgunaan. Benda yang remeh-remeh seperti menu bantuan (help), tooltip, on-the-fly editable content (dengan menggunakan ajax), penerangan penggunaan aplikasi dan juga dokumentasi (yang memadai untuk pengguna).

Dengan kata lain, bergantung pada skop aplikasi web yang hendak dibangunkan, aplikasi yang dibangunkan dapat dijual setelah berlalu 24 jam pertandingan tersebut. Saya tidak tahu bagaimana pemarkahan akan diberi (ada tak info pada laman web mereka? Rasanya tiada), tetapi itulah yang akan saya lakukan. Sehaluan dengan matlamat pertandingan tersebut:

  • Promote high level open source web application development skills in Malaysia.
  • Enable local OSS web application development communities to grow and establish themselves.
  • Encourage students to get involve in open source web application development and be well prepared for industry need.

Menggunakan notepad sebagai diari

Posted by mkhairul

Bagi seseorang yang nak benda paling simple sekali untuk buat diari, takyah install apa apa, anda hanya perlu notepad.

Bagaimana?

  1. Buka notepad (Start->Run->notepad.exe)
  2. Taip “.LOG” pada baris pertama.
  3. Save (namakan apa apa pun tak kisah) dan tutup fail. Bila anda bukanya semula, secara automatik ia akan menulis tarikh dan masa.



Sumber

Kepentingan penggunaan framework didalam pembangunan aplikasi

Posted by mkhairul

Apa itu framework?
Framework adalah suatu koleksi teknik dan cara yang diambil daripada aktiviti dalam pembangunan sistem seperti DAL (Database Abstraction Layer), ORM, input validation, caching, templating, dan sebagainya.

Berikut adalah senarai framework untuk pembangunan web.

Mengapa perlu menggunakan framework?
Ia mengelakkan anda daripada perlu mengulangi aktiviti mengkod (ataupun menyelesaikan masalah yang telahpun anda selesaikan) yang berulang dengan menggunakan prinsip DRY (Don’t Repeat Yourself).

Framework menggalakkan anda supaya memisahkan kod persembahan, kod kawalan, dan logik perniagaan. Memudahkan penyelenggaraan pada masa akan datang, memudahkan aktiviti pengayahpijat (debug) dan pelbagai lagi bergantung pada objektif-objektif framework tersebut (contohnya CakePHP, salah satu kebolehannya adalah ianya dapat mempercepatkan pembangunan CRUD aplikasi web).

Framework juga mempercepatkan pembangunan perisian kerana ia menyediakan ‘helper’ dan ‘library’ yang biasa digunapakai dalam pembangunan perisian seperti ORM, Date Manipulation, Upload, Profiling, Unicode, etc (seperti yang saya nyatakan diatas).

Framework mana yang bagus?
Tiada satu framework yang bagus untuk semua. Semua mempunyai kelemahan dan kelebihan. Untuk mengetahui dengan lebih tentang kelebihannya adalah dengan memahami objektif framework tersebut, feature-feature dan juga dengan mencubanya.

Kesimpulannya, kepentingan framework adalah kerana ianya..

  • menggalakkan ‘best practices
  • mempercepatkan pembangunan aplikasi
  • menyediakan modul, library dan helper untuk menyelesaikan permasalahan umum
  • memisahkan kod persembahan daripada kod pemprosesan (logik perniagaan, akses pangkalan data, etc)
  • memudahkan komunikasi (penggunaan istilah) diantara pengaturcara lain jika mereka menggunakan framework yang lebih kurang sama
  • mempunyai komuniti untuk membantu anda (jika anda menggunakan framework sendiri, maka tiada komuniti)
  • mempunyai pengaturcara khas untuk pembangunan framework tersebut maka anda tak perlu membangunkannya sendiri, hanya fokus pada aplikasi yang hendak dibangunkan

Itu adalah diantara yang dapat saya fikirkan buat masa ini, mungkin ada lebih lagi.

Dari sudut perniagaan, mengapa perlu menggunakan framework? Mempercepatkan prototaip, memudahkan penyelenggaran (mengurangkan error dan jika ada error lebih mudah untuk menjejakinya), memudahkan integrasi dengan aplikasi 3rd party (SAP, Peoplesoft, Facebook, Google Apps, Google Single Sign-on (SSO), dan bermacam lagi) bermaksud anda dapat melakukan lebih dalam masa yang singkat (berbanding tanpa menggunakan framework).

Masih kurang faham? Pilih satu framework, pilih satu projek (contohnya Pengurusan Tugasan (task management), Guestbook, Blog, etc) dan mula mengkod (berpandukan dokumentasi ataupun tutorial framework tersebut). Anda akan mendapat gambaran yang lebih jelas mengenainya apabila anda menggunakannya.

Selamat programming!

Sumber