<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sembang Programming &#187; perl</title>
	<atom:link href="http://sembangprogramming.com/category/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://sembangprogramming.com</link>
	<description>Sembangan mengenai pengaturcaraan</description>
	<lastBuildDate>Mon, 22 Aug 2011 06:49:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Memastikan input betul di dalam Perl</title>
		<link>http://sembangprogramming.com/2009/12/memastikan-input-betul-di-dalam-perl/</link>
		<comments>http://sembangprogramming.com/2009/12/memastikan-input-betul-di-dalam-perl/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 16:15:58 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[Tip]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=219</guid>
		<description><![CDATA[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) [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<pre class="perl" name="code">
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 &#038;&#038; $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;
</pre>
<p>Agak panjang, kan?<br />
Ianya mudah digunakan cuma include didalam Perl script anda.</p>
<pre class="perl" name="code">
use input_lib;

if(input_validate($foo, 'required|integer')){ die("Sila masukkan integer sahaja"); }
</pre>
<p>Mungkin ada cara yang lebih baik? Jom sembang di bahagian komen.</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2009/12/memastikan-input-betul-di-dalam-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Membasmi input-input durjana didalam Perl</title>
		<link>http://sembangprogramming.com/2009/11/membasmi-input-input-durjana-didalam-perl/</link>
		<comments>http://sembangprogramming.com/2009/11/membasmi-input-input-durjana-didalam-perl/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 04:58:11 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[sekuriti]]></category>
		<category><![CDATA[Tip]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=198</guid>
		<description><![CDATA[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 &#8220;penetration testing&#8221; (singkatan pen test) yang akan [...]]]></description>
			<content:encoded><![CDATA[<p>Memandangkan saya banyak menggunakan Perl/CGI sejak kebelakangan ni, post ni adalah berkaitan dengan perl/cgi. </p>
<p>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 &#8220;<a href="http://en.wikipedia.org/wiki/Penetration_test">penetration testing</a>&#8221; (singkatan pen test) yang akan merungkaikan segala kelemahan yang telah diabaikan selama ini didalam pembangunan perisian tersebut.</p>
<p>Apabila terjadi begitu, maka bermulalah operasi menampal perisian daripada lubang-lubang sekuriti tersebut. Bagi kebanyakan input daripada pengguna dalam Perl/CGI, menggunakan &#8220;<strong>placeholder</strong>&#8221; adalah mencukupi untuk menyimpannya dengan selamat dalam pangkalan data (database) mengelakkan daripada SQL Injection. Rujuk article di perlmonks untuk penerangan lanjut, <strong><a href="http://www.perlmonks.org/?node_id=661423">Preventing SQL injection attacks: Placeholders are enough for MySQL, Postgresql and SQLite.</a></strong></p>
<p><a href="http://imgs.xkcd.com/comics/exploits_of_a_mom.png"><img src="http://sembangprogramming.com/wp-content/uploads/2009/11/exploits_of_a_mom-300x92.png" alt="exploits_of_a_mom" title="exploits_of_a_mom" width="300" height="92" class="aligncenter size-medium wp-image-202" /></a></p>
<p><strong>Apa bendakah itu &#8220;placeholder&#8221;?</strong><br />
Placeholder adalah nilai yang digunakan untuk menggantikan sesuatu nilai yang lain. </p>
<p>Berikut adalah contoh penggunaan placeholder.</p>
<pre class="perl" name="code">
$sth = $dbh->prepare( "SELECT name WHERE city = ? AND state = ?" );
$sth->execute( $city, $state );
</pre>
<p>Dengan menggunakan placeholder, modul <a href="http://search.cpan.org/~timb/DBI/DBI.pm">DBI</a> akan secara automatik menguruskan isu-isu &#8220;quoting&#8221; (escape single/double quote, e.g. \&#8221;) didalam nilai yang dihantar kepada pangkalan data.</p>
<p><strong>Kekurangan &#8220;placeholder&#8221;</strong><br />
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.<br />
Jika input tersebut adalah berbentuk HTML, tukarkan semua character ke dalam <a href="http://search.cpan.org/~gaas/HTML-Parser-3.64/lib/HTML/Entities.pm">HTML Entities</a>, untuk mengelakkan daripada kes-kes <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">XSS (Cross-site Scripting)</a>. Jika tiada HTML dibenarkan, gunakan <a href="http://search.cpan.org/~podmaster/HTML-Scrubber-0.08/Scrubber.pm">HTML::Scrubber</a> untuk sental semua html daripada input tersebut.</p>
<p>Berikut adalah contoh untuk menukarkan character-character ke bentuk HTML Entity</p>
<pre class="perl" name="code">
use HTML::Entities;
sub html_to_db{
    my ($html) = @_;
	$html = encode_entities($html);
	$html =~ s/\r\n//gs;
	return $html;
}
</pre>
<p>Marilah kita sama sama <strong>belajar mempertahankan diri</strong> daripada anasir-anasir yang tak diingini apabila membangunkan perisian.</p>
<p><a href="http://sembangprogramming.com/wp-content/uploads/2009/11/249141325_4913641b29.jpg"><img src="http://sembangprogramming.com/wp-content/uploads/2009/11/249141325_4913641b29.jpg" alt="249141325_4913641b29" title="249141325_4913641b29" width="500" height="274" class="aligncenter size-full wp-image-204" /></a></p>
<p>Selamat programming!</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2009/11/membasmi-input-input-durjana-didalam-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl 5.11 telah dikeluarkan (release)</title>
		<link>http://sembangprogramming.com/2009/10/perl-5-11-telah-dikeluarkan-release/</link>
		<comments>http://sembangprogramming.com/2009/10/perl-5-11-telah-dikeluarkan-release/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 14:52:41 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=180</guid>
		<description><![CDATA[Bagi sesiapa yang menggunakan perl, keluaran baru Perl, iaitu versi 5.11 kini boleh diperolehi. Ianya adalah &#8216;development release&#8217; 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 [...]]]></description>
			<content:encoded><![CDATA[<p>Bagi sesiapa yang menggunakan perl, keluaran baru Perl, iaitu versi 5.11 kini boleh diperolehi. Ianya adalah &#8216;development release&#8217; dimana pengguna perl boleh menggunakannya untuk menyesuaikan aplikasi-aplikasi ataupun skrip skrip supaya serasi dengan keluaran 5.12 yang akan datang.</p>
<p>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.</p>
<p>Sumber:</p>
<ul>
<li><a href="http://www.modernperlbooks.com/mt/2009/10/why-perl-5110-matters.html">Why Perl 5.11.0 Matters</a></li>
<li><a href="http://www.nntp.perl.org/group/perl.perl5.porters/2009/10/msg151376.html">Perl 5.11.0 is now available</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2009/10/perl-5-11-telah-dikeluarkan-release/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bersihkan input menggunakan Perl</title>
		<link>http://sembangprogramming.com/2009/09/bersihkan-input-menggunakan-perl/</link>
		<comments>http://sembangprogramming.com/2009/09/bersihkan-input-menggunakan-perl/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 05:53:34 +0000</pubDate>
		<dc:creator>mkhairul</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[sekuriti]]></category>

		<guid isPermaLink="false">http://sembangprogramming.com/?p=176</guid>
		<description><![CDATA[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 -> [...]]]></description>
			<content:encoded><![CDATA[<p>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).</p>
<p>Kod dibawah agak ringkas.</p>
<pre name="code" class="perl">
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 &#038;error("SQL&#038;Couldn't execute statement: $DBI::errstr");
</pre>
<p>Jika ada cara lain, silalah kongsi! Terima kasih.</p>
]]></content:encoded>
			<wfw:commentRss>http://sembangprogramming.com/2009/09/bersihkan-input-menggunakan-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

