Tutorial PHP Membuat Form Anti Spam [Complete Fight Strategy]mungkin spam dah kaga asing lagi di telinga lu pada, dan mungkin lu rada heran knapa diakhir judul tutorial php kali ini gw tambahin [Complete Fight Strategy] ?
dari yg gw ketahui SPAM bersumber dari 2 jenis, yakni mesin dan manusia. mesin sebagai contoh adalah robot spam, yang dengan sengaja diciptakan untuk menelusuri keberadaan sebuah email pada form / website, sehingga lu kadang sering melihat email ditulis dengan mengganti string "@" menjadi "[at]". itu adalah salah satu cara mengindari robot spam dalam mendeteksi keberadaan email.
sedangkan spam yang diakibatkan oleh kinerja manusia langsung, bisa menggunakan junk, email boomber, komentar asal asal an pada posting blog, dan penggunaan third party form.
yang dimaksud third party form adalah: target aksi form lu, bisa diakses melalui form di luar server tempat lu meletakkan file form. itulah sebabnya knapa gw saranin banged untuk selalu mengosongkan form action pada setiap tutorial php gw, dan kemudian dapat di eksekusi melalui perintah isset($_POST['submit']), tapi hal ini masih kurang, ada hal yang lebih cerdas lagi dalam mengakali spammer model ini, yakni dengan memvalidasi HTTP REFFERER, yakni validasi asal URL form diakses, jika form diakses berasal dari server lu, maka aksi form diijinkan
1. config.phpberikut definisi yang gw letakkan pada file config.php agar aksi form dapat berjalan dengan dinamis, dan segala bentuk perubahan data string akan menjadi terpusat pada satu file

<?
/*
==============================================
Nama File: config.php
Fungsi: global configuration
Author: Hairul Azami - webmaster@dremi.info
==============================================
*/
//email info
define("_CONTACT_EMAIL", "webmaster@dremi.info");
define("_ABSOLUTE_PATH", "/form anti spam/");
define("_WEBSITE_SERVER", "http://localhost");
define("_IMAGES", "images/");
//definisi pesan error_msg2() jika pesan yg akan disampaikan seragam...
define ("varMsg_Name", "Invalid Name Chars"); //field Nama
define ("varMsg_Email", "Invalid E-Mail Pattern"); //field E-Mail
define ("varMsg_Website", "Invalid Website Pattern"); //field Website
define ("varMsg_Address", "Invalid Address Chars."); //field Alamat
define ("varMsg_Phone", "Invalid Phone Pattern"); //field No. Telepon
define ("varMsg_Subject", "Invalid Subject Chars"); //field Subjek / Judul
define ("varMsg_Content", "Invalid Message Chars"); //field Konten / isi
?>
ganti beberapa defini yang perlu saja, misal _ABSOLUTE_PATH, dan _WEBSITE_SERVER
dan ini untuk file
functions.php<?
/*
==============================================
Nama File: functions.php
Fungsi: global functions
Author: Hairul Azami - webmaster@dremi.info
==============================================
*/
require "config.php";
//BERIKUT BEBERAPA FUNGSI YG DIPERLUKAN UNTUK FILTER INPUTAN FORM
//validator char
function valid_str($str) {
$validstrku="[a-z,0-9,{,},;,(,),:alnum:,:,^,-,_,!,?,.,*]+$";
if(@eregi($validstrku,$str)) return true;
else return false;
}
//validator web-http
function valid_web($web) {
$validstrku="http://";
if(@eregi($validstrku,$web)) return true;
else return false;
}
//validator email
function valid_email($email) {
$pattern = "^[-_.[:alnum:]]+@((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]])\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$";
if(@eregi($pattern, $email)) return true;
else return false;
}
function wordFilter($strToFilter)
{
$strToFilter = str_replace("'", "", $strToFilter);
$strToFilter = str_replace(" ", " ", $strToFilter);
$strToFilter = str_replace('"', "", $strToFilter);
$strToFilter = str_replace("|", "", $strToFilter);
$strToFilter = str_replace("\'", "", $strToFilter);
$strToFilter = str_replace("\"", "", $strToFilter);
$strToFilter = str_replace("\\", "", $strToFilter);
$strToFilter = str_replace("/", "", $strToFilter);
$strToFilter = str_replace("\r\n", "<BR>", $strToFilter);
return $strToFilter;
}
//ERROR MASSAGE
function echo_msg1($msg)
{
echo "<div id='userMSG' style='padding-top:10px; padding-bottom:20px; font-weight:bold; font-size:14px; color: #666666;'> <img src='"._ABSOLUTE_PATH._IMAGES."perhatian.gif' border='0'> ";
echo $msg;
echo "</div>";
}
##################################################################################################
################ VALIDASI KHUSUS TAGS AREA, TAGS MANA SAJA YANG DI REMOVE DAN DI IZINKAN #########
##################################################################################################
/**
* tags yg diijinkan
*/
$allowedTags = '<b><strong><i><em><ul><ol><li><pre><blockquote><br>';
/**
* attributes/prefix yang tidak diijinkan dalam tags
*/
$stripAttrib = 'javascript:|onclick|ondblclick|onmousedown|onmouseup|onmouseover|'.
'onmousemove|onmouseout|onkeypress|onkeydown|onkeyup';
/**
* @return string
* @param string
* @desc Strip forbidden tags dan daur ulang tag-source untuk di check oleh fungsi removeEvilAttributes()
*/
function removeEvilTags($source)
{
global $allowedTags;
$source = strip_tags($source, $allowedTags);
return preg_replace('/<(.*?)>/ie', "'<'.removeEvilAttributes('\\1').'>'", $source);
}
/**
* @return string
* @param string
* @desc Strip forbidden attributes, dari sebuah tag
*/
function removeEvilAttributes($tagSource)
{
global $stripAttrib;
return stripslashes(preg_replace("/$stripAttrib/i", 'forbidden', $tagSource));
}
function valid_strCOM($strCOM)
{
$urlInjectPattern="!\bhttps?://([\w\-]+\.)+[a-zA-Z]{2,3}(/(\S+)?)?\b!";
if(@eregi($urlInjectPattern,$str)) return true;
else return false;
}
##################################################################################################
########## AKHIR VALIDASI KHUSUS TAGS AREA, TAGS MANA SAJA YANG DI REMOVE DAN DI IZINKAN #########
##################################################################################################
//jika ingin menyeragamkan error msg pada form html
function echo_msg2($varMsg)
{
if($varMsg=="name")
{
echo "<div id='userMSG' style='padding-top:10px; margin-bottom:20px; font-weight:bold; font-size:14px; color: green;'>
<img src='"._ABSOLUTE_PATH._IMAGES."perhatian.gif' border='0'> ";
echo varMsg_Name;
echo "</div>";
}
elseif($varMsg=="email")
{
echo "<div id='userMSG' style='padding-top:10px; margin-bottom:20px; font-weight:bold; font-size:14px; color: #666666;'>
<img src='"._ABSOLUTE_PATH._IMAGES."perhatian.gif' border='0'> ";
echo varMsg_Email;
echo "</div>";
}
elseif($varMsg=="website")
{
echo "<div id='userMSG' style='padding-top:10px; margin-bottom:20px; font-weight:bold; font-size:14px; color: #666666;'>
<img src='"._ABSOLUTE_PATH._IMAGES."perhatian.gif' border='0'> ";
echo varMsg_Website;
echo "</div>";
}
elseif($varMsg=="address")
{
echo "<div id='userMSG' style='padding-top:10px; margin-bottom:20px; font-weight:bold; font-size:14px; color: #666666;'>
<img src='"._ABSOLUTE_PATH._IMAGES."perhatian.gif' border='0'> ";
echo varMsg_Address;
echo "</div>";
}
elseif($varMsg=="phone")
{
echo "<div id='userMSG' style='padding-top:10px; margin-bottom:20px; font-weight:bold; font-size:14px; color: #666666;'>
<img src='"._ABSOLUTE_PATH._IMAGES."perhatian.gif' border='0'> ";
echo varMsg_Phone;
echo "</div>";
}
elseif($varMsg=="subject")
{
echo "<div id='userMSG' style='padding-top:10px; margin-bottom:20px; font-weight:bold; font-size:14px; color: #666666;'>
<img src='"._ABSOLUTE_PATH._IMAGES."perhatian.gif' border='0'> ";
echo varMsg_Subject;
echo "</div>";
}
elseif($varMsg=="content")
{
echo "<div id='userMSG' style='padding-top:10px; margin-bottom:20px; font-weight:bold; font-size:14px; color: #666666;'>
<img src='"._ABSOLUTE_PATH._IMAGES."perhatian.gif' border='0'> ";
echo varMsg_Content;
echo "</div>";
}
}
?>
Penjelasan masing masing fungsi://validator char
function valid_str($str) {
$validstrku="[a-z,0-9,{,},;,(,),:alnum:,:,^,-,_,!,?,.,*]+$";
if(@eregi($validstrku,$str)) return true;
else return false;
}
diperlukan untuk memfilter string inputan pada filed form text, hanya karakter a-z,0-9,{,},;,(,),:alnum:,:,^,-,_,!,?,.,* yang diizinkan selain itu bernilai false, sehingga diperlukan fungsi echo_msg2() untuk menampilkan pesan kesalahan
//validator web-http
function valid_web($web) {
$validstrku="http://";
if(@eregi($validstrku,$web)) return true;
else return false;
}
validasi string pada text filed yang khusus bwat website url, jika tidak mengandung string http:// maka akan bernilai false
valid_email($email)
karena pattern terlalu panjang, gw gw ketik lagi, ini sama hal nya dengan validasi valid_str diatas
function wordFilter($strToFilter)
{
$strToFilter = str_replace("'", "", $strToFilter);
$strToFilter = str_replace(" ", " ", $strToFilter);
$strToFilter = str_replace('"', "", $strToFilter);
$strToFilter = str_replace("|", "", $strToFilter);
$strToFilter = str_replace("\'", "", $strToFilter);
$strToFilter = str_replace("\"", "", $strToFilter);
$strToFilter = str_replace("\\", "", $strToFilter);
$strToFilter = str_replace("/", "", $strToFilter);
$strToFilter = str_replace("\r\n", "<BR>", $strToFilter);
return $strToFilter;
}
terkadang gw kesal dengan komen yang mengandung string " (petik dua) atau ' (petik satu) nah dengan fungsi buatan gw wordFilter ini, akan menghandel permasalahn gw

masih tetap tersenyum kan

$stripAttrib bernilai sederetan karakter yang akan di hilangkan pada atribut tag yg terinput, masih inget tutorial XSS injection pada PHP Security gw ? nah ini salah satu penangkal nya

fungsi removeEvilTags() bertugas meremove tag tag yang gw sebut sebagi EVIL TAG (TAG SETAN) dan berbahaya
sedangkan fungsi removeEvilAttributes() bertugas meremove atribut yang tidak tiijinkan
sedangkan fungsi valid_strCOM() hanyalah varian dari fungsi valid_str()
B. FORM DAN AKSIberikut struktur form nya:
<form action="#userMSG" method="post">
<label>Name: <font color="#999999">(required)</font></label>
<input class="input" name="name" value="<? echo $_POST['name'] ?>" type="text" size="50" />
<label>E-Mail: <font color="#999999">(required)</font></label>
<input class="input" name="email" value="<? echo $_POST['email'] ?>" type="text" size="50" />
<label>Website: <font color="#999999">(required)</font></label>
<input class="input" name="website" value="<? if(isset($_POST['website'])) { echo $_POST['website']; } else { echo "http://"; } ?>" type="text" size="50" />
<label>Message:</label>
<textarea class="input" name="message" cols="38" rows="5"><? echo $_POST['message'] ?></textarea>
<div class="spacer"></div>
<label>Spam Protection: <font color="#999999">(required)</font></label>
<?
$a = rand(2, 8);
$b = rand(1, 5);
$session_sum = $a + $b;
$_SESSION['session_sum'] = $session_sum;
echo "<label>$a + $b = ?</label>";
?>
<input type="text" name="user_sum" size="4" maxlength="4" class="input" />
<div class="space"> </div>
<input name="submit" value="" class="submit" type="submit" />
</form>
sederhana kok, cuma yang perlu gw garis bawahi adalah penguunaan action ="#userMSG" dimaksudkan seperti yg gw bilang sebelumna, untuk mencegah spammer melakukan aksi third party form dari luar server, dan dengan demikian tentu saja aksi akan dijalankan pada file yg sama juga
LIVE PREVIEW
DOWNLOAD FULL SCRIPT: