2012年1月31日 星期二

joomla 1.5 前台登錄、註冊、忘記密碼、帳號等加入recapthca驗證碼驗證功能的方法

下載recapthca的php資源的方法與申請設recapthca帳號、公鑰、私鑰的方法請自行參閱這篇文章,joomla 1.5後台管理加入recapthca的作法,重複的部份,這裡不再談了!

為joomla 1.5量身訂做的驗證碼驗證套件很多,為何還要辛苦去手動改為recapthca驗證碼,其實最主要還是安全的問題,因為recapthca驗證碼是有專人免費維護更新,所以較沒有必須不斷更新驗證碼的麻煩與被破解的風險。也因此筆者才要做這個更改,再者它也提供無障礙功能!

我們的目標是要在Joomla 1.5裡,在使用者註冊使用者登入忘記帳號忘記密碼等四個頁面裡加入recapthca驗證碼驗證功能。如下圖

imageimageimageimage

要完成這四個目標頁面,主要必須找到Joomla 1.5裡相關檔案,在該檔案中適當的位置加入相關的recapthca驗證碼語法!

其中所謂的相關檔案主要放於下列資料夾裡:

 

components/com_user/views

進到裡面可以看到如下圖五個資料夾

image

而要的檔案分別在login、register、remind、reset,四個資料夾裡的各別的tmpl資料夾裡。

image

再進到tmpl資料夾裡,我們要改的default_login.php就在這裡,而另一個紅色箭頭指的recaptchalib.php這支程式則是要自己複製進來的(參考joomla 1.5後台管理加入recapthca的作法)

image

接著我來說明如何改default_login.php這個程式:

vim default_login.php

找到約49行的位置,加入(注意細節請參考joomla 1.5後台管理加入recapthca的作法)

<?php
//底下是發哥自己加入的
?>
<div align="center">請於下列欄位中輸入下圖所見之驗證碼</div>
<div align="right"><?php
require_once('recaptchalib.php');
          $publickey = "你的公開鑰匙"; // you got this from the signup page
          echo recaptcha_get_html($publickey);
        ?></div>
<?php
//以上是哥發自己加入的
?>

存檔

接著分別更改下列路徑裡的檔案

路徑 更改之檔案 加於第幾行後 加的內容 備註
register/tmpl default.php 75 <?php
//底下是發哥自己加入的
?>
<div align="center">請於下列欄位中輸入下圖所見之驗證碼</div>
<div align="right"><?php
require_once('recaptchalib.php');
$publickey = "你的公開鑰匙"; // you got this from the signup page
echo recaptcha_get_html($publickey);
?></div>
<?php
//以上是哥發自己加入的
?>
此路徑裡亦必須拷備一份recaptchalib.php這支程式
remind/tmpl default.php 24 <?php
//底下是發哥自己加入的
?>
<div align="center">請於下列欄位中輸入下圖所見之驗證碼</div>
<div align="right"><?php
require_once('recaptchalib.php');
$publickey = "你的公開鑰匙"; // you got this from the signup page
echo recaptcha_get_html($publickey);
?></div>
<?php
//以上是哥發自己加入的
?>
此路徑裡亦必須拷備一份recaptchalib.php這支程式
reset/tmpl default.php 26 <?php
//底下是發哥自己加入的
?>
<div align="center">請於下列欄位中輸入下圖所見之驗證碼</div>
<div align="right"><?php
require_once('recaptchalib.php');
$publickey = "你的公開鑰匙"; // you got this from the signup page
echo recaptcha_get_html($publickey);
?></div>
<?php
//以上是哥發自己加入的
?>
此路徑裡亦必須拷備一份recaptchalib.php這支程式

做完以上設定後就可以在前台裡看到這些畫面了

imageimageimageimage

然而這樣還未完成,還必須去更改一個檔案:

components/com_user/裡的controller.php

打開這支程式

vim controller.php

分別找到

function login()

function register_save()

function requestreset()

function remindusername()

這幾段落,在其中適當的位置分別加上下列這段語法

//
  require_once('recaptchalib.php');
  $privatekey = "你的私人密鑰";
  $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);

  if (!$resp->is_valid) {
    // What happens when the CAPTCHA was entered incorrectly
    die ("你輸入的驗證碼錯誤,請回上一頁再試一次!" .
         "(reCAPTCHA said: " . $resp->error . ")");
  } else {
    // Your code here to handle a successful verification
  }

//

以function login()為例,我加完後變成這樣

        function login()
        {
                // Check for request forgeries
                JRequest::checkToken('request') or jexit( 'Invalid Token' );

                global $mainframe;
                $useSecurityImagesInLogin = false;
                        if (file_exists(JPATH_SITE.DS."administrator".DS."components".DS."com_securityimages".DS."config.securityimages.php")) {
                include(JPATH_SITE.DS."administrator".DS."components".DS."com_securityimages".DS."config.securityimages.php");
                $useSecurityImagesInLogin = $securityImagesInLogin;
            }
//
  require_once('recaptchalib.php');
  $privatekey = "我的私人密鑰";
  $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);

  if (!$resp->is_valid) {
    // What happens when the CAPTCHA was entered incorrectly
    die ("你輸入的驗證碼錯誤,請回上一頁再試一次!" .
         "(reCAPTCHA said: " . $resp->error . ")");
  } else {
    // Your code here to handle a successful verification
  }

//

if ($return = JRequest::getVar('return', '', 'method', 'base64')) {
                        $return = base64_decode($return);
                        if (!JURI::isInternal($return)) {
                                $return = '';
                        }
                }

其它的幾個段落就比照此方式去加入即可!

分別加入後,最後還要在上傳一份recaptchalib.php這支程式到components/com_user裡,這樣就可以在joomla 1.5的使用者註冊使用者登入忘記帳號忘記密碼等四個頁面裡,正式使用recapthca驗證碼的驗證功能了!現在你的joomla 1.5前台更安全了!

沒有留言: