寫Typecho主題時候碰到的問題,在登陸時候添加驗證碼。前端
Typecho有很好的路由機制,而且MVC模型模塊化作的很好。session
系統代碼在/var/
中,包括了:Widget工具,Typecho模型等。dom
開發者二次開發代碼在/usr/
中,主要放置Theme主題,Plugins插件等。模塊化
添加驗證碼不能用插件形式,所以只能直接在源碼中更改。typecho
這裏說兩種驗證碼方式,Geetest極驗驗證,和用php生成圖片兩種方法。工具
這個簡單,到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
一、修改前端代碼,修改/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
2015-03-25 14:49:20