今天做一個簡單的資訊收集功能,用到了表單,作為最最基本的防刷機制,驗證碼還是要有的,雖然不像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點觸式驗證碼等,隨著網路安全的 攻防戰,以後的驗證碼肯定也越來越智慧,功能雖小但作用很大!