Typecho添加驗證碼

http://homeway.mephp


0x01.關於

寫Typecho主題時候碰到的問題,在登陸時候添加驗證碼。前端

Typecho有很好的路由機制,而且MVC模型模塊化作的很好。session

系統代碼在/var/中,包括了:Widget工具,Typecho模型等。dom

開發者二次開發代碼在/usr/中,主要放置Theme主題,Plugins插件等。模塊化

添加驗證碼不能用插件形式,所以只能直接在源碼中更改。typecho

這裏說兩種驗證碼方式,Geetest極驗驗證,和用php生成圖片兩種方法。工具



0x02.Geetest極驗

這個簡單,到http://geetest.com/官網註冊下帳號。ui

一、按照極驗的要求,修改前端代碼,即,在/admin/login.php中添加代碼。this

二、添加Geetest插件,在/var/Widget/中添加Geetestlib.phpurl

三、修改後臺驗證端,修改/var/Widget/Login.php以下:

require_once('Geetestlib.php');
class Widget_Login extends Widget_Abstract_Users implements Widget_Interface_Do {
    public function action() {
        /*  此處...省略...字 */

        /* 極驗代碼 */
        $captcha_id = "xxxxxxxxxxxxx";//TODO: replace it with your own captcha's id
        $private_key = "xxxxxxxxxxxxx";//TODO: replace it with your own captcha's key
        $geetestlib = new GeetestLib($captcha_id,$private_key);
        if (isset($_POST['geetest_challenge']) && isset($_POST['geetest_validate']) &&  isset($_POST['geetest_seccode'])) {
            $validate_response = $geetestlib->geetest_validate(@$_POST['geetest_challenge'], @$_POST['geetest_validate'], @$_POST['geetest_seccode']);
        }else{
            $this->widget('Widget_Notice')->set("use your own captcha validate ");
            $this->response->goBack();
        }
        if ($validate_response == TRUE) {
        } else if ($validate_response == FALSE) {
            $this->widget('Widget_Notice')->set('請先驗證');
            $this->response->goBack();
        }else{
            $this->widget('Widget_Notice')->set('FORBIDDEN');
            $this->response->goBack();
        }
        /*  此處...省略...字 */
 }

...部分代碼,詳細下載連接以下:

http://homeway.me/code/typecho-Login-1.php



0x02.php生成圖片

一、修改前端代碼,修改/admin/login.php,添加以下:

<p>
        <img style="cursor:pointer" title="刷新驗證碼" id="refresh" border='0' src='verify.php' onclick="document.getElementById('refresh').src='typecho-code.php?t='+Math.random()"/>
    </p>
    <p>
        <label for="name" class="sr-only"><?php _e('驗證碼'); ?></label>
        <input type="text" id="name" name="verify" value="" placeholder="<?php _e('驗證碼'); ?>" class="text-l w-100" />
    </p>

二、添加php生成驗證碼的php插件,添加到/admin/typecho-code.php/admin/typecho-t1.ttf,代碼下載:

http://homeway.me/code/typecho-code.php

http://homeway.me/code/typecho-t1.ttf

三、修改後臺驗證代碼,修改/var/Widget/Login.php以下:

session_start();
$flag=true;
class Widget_Login extends Widget_Abstract_Users implements Widget_Interface_Do {
    public function action() {
        /*  此處...省略...字 */
        if (strtolower($_POST['verify']) != strtolower($_SESSION['verify']) ) {
            /** 防止窮舉,休眠3秒 */
            sleep(3);
            $this->widget('Widget_Notice')->set(_t('驗證碼錯誤!'), 'error');
            $this->response->goBack('?referer=' . urlencode($this->request->referer));
            $flag = false;
        }else{
            /** 若是驗證碼對了,開始驗證用戶 **/
            $valid = $this->user->login($this->request->name, $this->request->password,
            false, 1 == $this->request->remember ? $this->options->gmtTime + $this->options->timezone+30*24*3600 : 0);
            /** 比對密碼 */
            if (!$valid) {
                /** 防止窮舉,休眠3秒 */
                sleep(3);
                $this->pluginHandle()->loginFail($this->user, $this->request->name,
                $this->request->password, 1 == $this->request->remember);
                Typecho_Cookie::set('__typecho_remember_name', $this->request->name);
                $this->widget('Widget_Notice')->set(_t('用戶名或密碼無效'), 'error');
                $this->response->goBack('?referer=' . urlencode($this->request->referer));
            }
            $this->pluginHandle()->loginSucceed($this->user, $this->request->name,
            $this->request->password, 1 == $this->request->remember);
        }
        /*  此處...省略...字 */
    }
}

...部分代碼,詳細下載連接以下:

http://homeway.me/code/typecho-Login-2.php




本文出自 夏日小草,轉載請註明出處: http://homeway.me/2015/03/25/add-check-code-for-typecho/

by 小草

2015-03-25 14:49:20

相關文章
相關標籤/搜索