Mambo CMS: Captcha Contact Component di 4.5.*

Mambo CMS versi terbaru (4.6.2) menawarkan fitur autentikasi captcha yang sudah di-include kan di sistem core. Sayangnya fitur tersebut tidak tersedia di versi lawas 4.5.5 dan versi-versi sebelumnya. Padahal masih banyak pengguna yang menggunakan versi 4.5.* yang ingin memiliki fitur tersebut tanpa harus meng-upgrade mambo nya ke versi baru karena pertimbangan kompatibilitas component yg belum sebanyak versi sebelumnya. tutorial ini akan sedikit mengupas tips memiliki fitur captcha di component contact di versi Mambo 4.5.* menggunakan script yang ada di mambo 4.6.2. fitur captcha ini nantinya akan bisa kita gunakan utk form2 lain dengan metode yang sama.

File-file yg akan dijelaskan diasumsikan menggunakan 4.5.4 sehingga kemungkinan ada sedikit perubahan. Yang pertama kita lakukan adalah mendownload mambo terbaru 4.6.2, mengekstrak dan mengambil file2 berikut utk kita copy kan ke mambo kita. Pastikan lokasi nya sama.

includes/captchaFonts
includes/captcha.php

setelah kita copy folder captchaFonts dan file captcha.php, edit file captcha.php, tambahkan kode berikut di baris paling pertama

PHP:
  1. /** ensure this file is being included by a parent file */
  2. defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );

kode diatas berfungsi agar file captcha.php tidak bisa diakses langsung tetapi harus di include-kan melalui index2.php yg akan kita edit juga nanti. Selanjutnya, cari baris yg berisi:

PHP:
  1. // Fontsetup
  2. $font = './captchaFonts/font1.ttf';

ubah menjadi:

PHP:
  1. // Fontsetup
  2. $font = $mosConfig_absolute_path.'/includes/captchaFonts/font1.ttf';

Seperti terlihat, kita merubah lokasi include folder, menggunakan variabel $mosConfig_absolute_path. simpan, kemudian edit file index2.php di root folder mambo kamu. cari baris yg berisi:

PHP:
  1. $mainframe->initSession();

Persis setelah baris tersebut. tambahkan code berikut sehingga menjadi:

PHP:
  1. $mainframe->initSession();
  2.  
  3. //modifikasi utk intercept kalo request berupa captcha
  4. if ($option == 'captcha') {
  5.     include('includes/captcha.php');
  6.     exit();
  7. }

Dengan menambahkan kode diatas, kita dapat mengakses file captcha melalui index2.php?option=captcha. Selanjutnya ubah file component contact di components/com_contact/contact.html.php cari fungsi _writeEmailForm dan cari baris yg berisi:

PHP:
  1. <?php
  2. if ( $params->get( 'email_copy' ) ) {
  3. ?>
  4.   <br />
  5.   <input type="checkbox" name="email_copy"  value="1"  />
  6. <?php      echo(_EMAIL_A_COPY);
  7. }
  8. ?>
  9. <br/><br/>

dibawah kode tersebut tambahkan kode berikut:

PHP:
  1. <?php echo 'Security Check. Please enter the code seen below:';?>
  2. <input type='text' name='spamstop' maxlength='5' size='5' class='inputbox' title=''>
  3. <img src='index2.php?option=captcha' border='0' title='' alt='' align='absmiddle' />
  4. <br /><br />

kode diatas menambahkan input field untuk user agar mengisi verifikasi kode dan image yg digenerate dari captcha.php. Selanjutnya edit file components/com_contact.php. File ini adalah file yang akan memproses dan melakukan validasi form. Cari fungsi sendmail, tepat dibawah definisi global berikut:

PHP:
  1. function sendmail( $con_id, $option ) {
  2.     global $database, $Itemid;
  3.     global $mosConfig_sitename, $mosConfig_live_site, $mosConfig_mailfrom, $mosConfig_fromname;

tambahkan kode dibawah ini:

PHP:
  1. $spamstop = mosGetParam( $_POST, 'spamstop', '' );
  2. if(isset($_SESSION['code']) && ($_SESSION['code'] != "") && ($_SESSION['code'] == $spamstop)) {
  3.   $captcha_success = 1; // success
  4. } else {
  5.   $captcha_success = 2; // fail
  6. }

kode diatas akan mengecek apakah kode yg dimasukkan user sama dengan kode yg digenerate oleh captcha.php. Terakhir, rubah kode berikut:

PHP:
  1. $query = "SELECT * FROM #__contact_details WHERE id='$con_id'";
  2. $database->setQuery( $query );
  3. $contact    = $database->loadObjectList();
  4.  
  5. $default    = $mosConfig_sitename.' '. _ENQUIRY;
  6. $email   = trim( mosGetParam( $_POST, 'email', '' ) );
  7. $text     = trim( mosGetParam( $_POST, 'text', '' ) );
  8. $name     = trim( mosGetParam( $_POST, 'name', '' ) );
  9. $subject    = trim( mosGetParam( $_POST, 'subject', $default ) );
  10. $email_copy = mosGetParam( $_POST, 'email_copy', 0 );
  11.  
  12. if ( !$email || !$text || ( is_email( $email )==false ) ) {
  13.     echo "<script>alert (\""._CONTACT_FORM_NC."\"); window.history.go(-1);</script>";
  14.     exit(0);
  15. }
  16. $prefix = sprintf( _ENQUIRY_TEXT, $mosConfig_live_site );
  17. $text   = $prefix ."\n". $name. ' <'. $email .'>' ."\n\n". stripslashes( $text );
  18.  
  19. mosMail( $email, $name , $contact[0]->email_to, $mosConfig_fromname .': '. $subject, $text );
  20.  
  21. if ( $email_copy ) {
  22.     $copy_text = sprintf( _COPY_TEXT, $contact[0]->name, $mosConfig_sitename );
  23.     $copy_text = $copy_text ."\n\n". $text .'';
  24.     $copy_subject = _COPY_SUBJECT . $subject;
  25.     mosMail( $mosConfig_mailfrom, $mosConfig_fromname, $email, $copy_subject, $copy_text );
  26. }
  27. ?>
  28. <script>
  29. alert( "<?php echo _THANK_MESSAGE; ?>" );
  30. document.location.href='<?php echo sefRelToAbs( 'index.php?option='. $option .'&Itemid='. $Itemid ); ?>';
  31. </script>

menjadi:

PHP:
  1. if ($captcha_success == 1) {
  2.     $query = "SELECT * FROM #__contact_details WHERE id='$con_id'";
  3.     $database->setQuery( $query );
  4.     $contact    = $database->loadObjectList();
  5.  
  6.     $default    = $mosConfig_sitename.' '. _ENQUIRY;
  7.     $email   = trim( mosGetParam( $_POST, 'email', '' ) );
  8.     $text     = trim( mosGetParam( $_POST, 'text', '' ) );
  9.     $name     = trim( mosGetParam( $_POST, 'name', '' ) );
  10.     $subject    = trim( mosGetParam( $_POST, 'subject', $default ) );
  11.     $email_copy = mosGetParam( $_POST, 'email_copy', 0 );
  12.  
  13.     if ( !$email || !$text || ( is_email( $email )==false ) ) {
  14.         echo "<script>alert (\""._CONTACT_FORM_NC."\"); window.history.go(-1);</script>";
  15.         exit(0);
  16.     }
  17.     $prefix = sprintf( _ENQUIRY_TEXT, $mosConfig_live_site );
  18.     $text   = $prefix ."\n". $name. ' <'. $email .'>' ."\n\n". stripslashes( $text );
  19.  
  20.     mosMail( $email, $name , $contact[0]->email_to, $mosConfig_fromname .': '. $subject, $text );
  21.  
  22.     if ( $email_copy ) {
  23.         $copy_text = sprintf( _COPY_TEXT, $contact[0]->name, $mosConfig_sitename );
  24.         $copy_text = $copy_text ."\n\n". $text .'';
  25.         $copy_subject = _COPY_SUBJECT . $subject;
  26.         mosMail( $mosConfig_mailfrom, $mosConfig_fromname, $email, $copy_subject, $copy_text );
  27.     }
  28.     ?>
  29.     <script>
  30.     alert( "<?php echo _THANK_MESSAGE; ?>" );
  31.     document.location.href='<?php echo sefRelToAbs( 'index.php?option='. $option .'&Itemid='. $Itemid ); ?>';
  32.     </script>
  33.     <?php
  34.    
  35. } else {
  36.     echo "<script> alert('Incorrect Security Code '); window.history.go(-1);</script>";
  37. }

di kode tersebut kita mengecek, jika verifikasi sukses, jalankan kode2 sesudahnya, atau keluarkan javascript error message. That's all! Kalo gak mau repot2, silahkan download file2 berikut ini dan replace file2 lama, jangan lupa di backup dulu file2 yg lama kale aja ada error :)

happy mambo!

modifikasi file com_contact
file captcha di folder includes
modifikasi file index2.php

10 Responses to “Mambo CMS: Captcha Contact Component di 4.5.*”


  1. 1 arifkurniawan

    Thanks euy atas tutsnya.

    BTW, trik ini mampu menangkap SPAM yang tanpa link ga, bli? (yang ternyata tidak mampu ditangkap WP)

    Oh ya, yang kedua, kenapa mos_Confid_absolute_path nya harus merubah folder?

    Thx

    (*asik euy nanya langsung ama cordev nya*)

  2. 2 adisetiawan

    [quote comment="226"]Thanks euy atas tutsnya.

    BTW, trik ini mampu menangkap SPAM yang tanpa link ga, bli? (yang ternyata tidak mampu ditangkap WP)

    Oh ya, yang kedua, kenapa mos_Confid_absolute_path nya harus merubah folder?
    [/quote]

    kalo SPAM tanpa link, selama itu robot, AFAIK masih bisa ditangkal. kenapa harus rubah folder include font? biar enak aja dan keliatan seragam :P

  3. 3 Suwahadi

    Wah ini yang lagi aku cari2
    Soale banyak SPAM yang ‘rajin’ masuk ke website-ku
    Oya salam kenal ya mas…
    :D

  4. 4 adisetiawan

    [quote comment="234"]Wah ini yang lagi aku cari2
    Soale banyak SPAM yang ‘rajin’ masuk ke website-ku
    Oya salam kenal ya mas…
    :D[/quote]

    met kenal juga, mudah2an spam-nya berkurang :D, saya doain..

  5. 5 lilamr

    mas, mo nanya…
    kalo mo ganti gambar header atau gambar lain yg ada di template defaulnyta bisa gak lewat administrator? caranya? atau harus langsung ganti filenya aja lewat cpanel?
    thx….

  6. 6 adisetiawan

    [quote comment="242"]caranya? atau harus langsung ganti filenya aja lewat cpanel?
    thx….[/quote]

    lewat cpanel aja

  7. 7 lilamr

    sip… ganti logonya dah bisa…

    terus, kalo ada peringatan seperti ini:

    Joomla! RG_EMULATION setting is `ON` instead of `OFF` in file globals.php

    maksudnya apa? dan cara ngilanginnya gimana?

    thx….

  8. 8 adisetiawan

    [quote comment="247"]
    maksudnya apa? dan cara ngilanginnya gimana?
    thx….[/quote]

    di global configuration, Register Globals Emulation.

  9. 9 rizky

    mas,,,bagaimana dengan mambo versi 4.6.1

    apakah bisa dengan mengupdate file2 diatas ?

    salam kenal :)

    rizky

  10. 10 adisetiawan

    [quote comment="260"]mas,,,bagaimana dengan mambo versi 4.6.1
    apakah bisa dengan mengupdate file2 diatas ?
    salam kenal :)
    [/quote]

    met kenal juga. kan 4.6 udah ada captcha by default :P

Leave a Reply




It seems you're using an unsafe, out-of-date browser. Click here to upgrade to Firefox for free. X