首頁>技術>

今天做一個簡單的資訊收集功能,用到了表單,作為最最基本的防刷機制,驗證碼還是要有的,雖然不像12306網站那樣有那麼多人盯著,還是預防萬一的。

習慣了框架php框架yii2 ,就用框架自帶的驗證碼來實現吧,之前一直有人說yii的驗證碼有bug,也順便驗證一下。

驗證碼用到的action類是 yii\\captcha\\CaptchaAction

以下列出示例程式碼

1. controller 程式碼

class BusinessController extends Controller {

public function actions(){

return [

'captcha' => [

'class' => 'yii\\captcha\\CaptchaAction',

'minLength' => 4,

'maxLength' => 4

], //還有一些其他的引數,比如圖片背景之類的

];

}

public function actionIndex(){

$model = new Contact();

if ($model->load(Yii::$app->request->post()) && $model->validate()) {

$rs = $model->save();

}

return $this->render('index', [

'model' => $model

]);

}

}

2. model程式碼:

繼承自 yii\\db\\ActiveRecord

class Contact extends ActiveRecord {

public $verifyCode;

public function rules() {

return [

..........

['verifyCode', 'captcha', 'captchaAction'=>'business/captcha', 'message' => '{attribute}錯誤']

];

}

}

3. view程式碼:

use yii\\bootstrap\\ActiveForm;

use yii\\captcha\\Captcha;

<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>

。。。。。。。

<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [

'captchaAction'=>'business/captcha',

'imageOptions'=>['id'=>'captchaimg','alt'=>'點選換圖','title'=>'點選換圖', 'style'=>'cursor:pointer'],

'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',

]) ?>

<?php ActiveForm::end(); ?>

4. 出現的一點小問題

在除錯中發現驗證碼不正確,每次都是,檢視原始碼的驗證過程,

檢視 yii\\captcha\\CaptchaAction

public function validate(),新增除錯程式碼,把變數的值數出來

輸出session驗證碼和使用者輸入的驗證碼

echo $input . '||' . $code. ';';

發現每次都是輸出兩次,第一次是正確的,第二次是錯誤的,這說明驗證了兩次,第一次驗證成功後,看下面的程式碼,當驗證成功是,$valid為TRUE,然後重新生成了驗證碼,所以第二次是錯誤的。

if ($valid || $session[$name] > $this->testLimit && $this->testLimit > 0) {

$this->getVerifyCode(true); //重新生成驗證碼

}

出問題的程式碼在controller中如下程式碼

if ($model->load(Yii::$app->request->post()) && $model->validate()) {

$rs = $model->save();

}

這裡的validate()和save()都會驗證一次,所以會出錯.改正後的程式碼如下:

if ($model->load(Yii::$app->request->post()) && $rs = $model->save()) {

.......

}

5. 總結

驗證碼是網路安全最常用的驗證措施之一,隨著技術的發展,機器識別越來越厲害,最初的圖片驗證碼也升級成了,最常見的類似於手機的滑動解鎖拖動式驗證碼,還有12306點觸式驗證碼等,隨著網路安全的 攻防戰,以後的驗證碼肯定也越來越智慧,功能雖小但作用很大!

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Windows軟體包管理器scoop介紹