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.

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.

Selamat programming!