2052 Posts in 477 Topics- by 811 Members - Latest Member: canmasagi

Pages: [1]   Go Down
  Print  
Author Topic: Tutorial PHP Membuat Form AntiSpam [Complete Fight Strategy]  (Read 1670 times)
webmaster
Administrator
phpBB Guru
*****
Offline Offline

Posts: 914


hairulazami
View Profile WWW
« on: October 05, 2008, 03:35:03 PM »

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 Smiley

1. config.php
berikut 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 Smiley

Code:
<?
/*
==============================================
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

Code:
<?

/*
==============================================
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:

Code:
//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

Code:
//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

Code:
valid_email($email)

karena pattern terlalu panjang, gw gw ketik lagi, ini sama hal nya dengan validasi valid_str diatas

Code:
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 Smiley

masih tetap tersenyum kan Smiley

$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 Smiley

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 AKSI

berikut struktur form nya:

Code:
<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">&nbsp;</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 Smiley

LIVE PREVIEW


DOWNLOAD FULL SCRIPT:
« Last Edit: June 24, 2009, 07:20:45 PM by webmaster » Logged


radiaku
phpBB Guru
*
Offline Offline

Posts: 6


View Profile
« Reply #1 on: October 05, 2008, 03:59:20 PM »

wew keren dah  :oops:  :oops:

teryata cara buatnya kayak gitu

baru tahu aku  Sad  Sad  :motz:  :motz:
Logged
webmaster
Administrator
phpBB Guru
*****
Offline Offline

Posts: 914


hairulazami
View Profile WWW
« Reply #2 on: October 05, 2008, 04:06:50 PM »

masa sih secepat itu komen nya, udah baca apa cuma lewat dowank Huh? :motz:  Cheesy  :D
Logged


tedywinanto
phpBB Guru
*
Offline Offline

Posts: 20


tedy_winanto
View Profile WWW
« Reply #3 on: October 13, 2008, 10:07:47 AM »

Wah bunk Emi... akhirnya setelah ditunggu2.....
Thanx banget nich tutorial nya...

ini yang saya cari dan tunggu dari bunk emi seperti janji bunk waktu itu... akan membuatkan tutorial tentang caphca antispam...
he....
Thanx yach...
 Tongue  8)
Logged

webmaster
Administrator
phpBB Guru
*****
Offline Offline

Posts: 914


hairulazami
View Profile WWW
« Reply #4 on: October 22, 2008, 09:16:36 AM »

Quote from: "tedywinanto"
Wah bunk Emi... akhirnya setelah ditunggu2.....
Thanx banget nich tutorial nya...

ini yang saya cari dan tunggu dari bunk emi seperti janji bunk waktu itu... akan membuatkan tutorial tentang caphca antispam...
he....
Thanx yach...
 Tongue  :?

kadang2 males, kalo user lama tapi jarang2 maen ke sini. kalo ini sih, bukan bwat menjawab pertanyaan lu, tapi tutorial seperti biasanya bwat smua member.
Logged


irones
phpBB Guru
*
Offline Offline

Posts: 6


View Profile Email
« Reply #5 on: May 12, 2010, 11:34:47 AM »

Thx. Sangat berguna Smiley
Logged
Pages: [1]   Go Up
  Print  
 
Jump to: