Captcha(全自动区分计算机和人类的图灵测试-Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA)俗称验证码,是一种区分用户是计算机和人的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
Yii Framework提供了类CCaptcha和CCaptchaAction用于支持验证码,要注意的是这个功能需要有PHP GD扩展支持,可以通过Yii的Requirements应用来查询:
如果显示Warning,可以通过安装GD扩展库,并修改PHP.ini打开该功能。
CCaptcha也提供方法CCaptcha::checkRequirements() 来检测GD库是否安装。
通过修改Yii Framework 开发教程(16) UI 组件 StarRating示例 为其添加Captcha功能,只有输入的验证码正确时,用户评分才有效,避免机器自动评分。
首先是修改DataModel,添加一个属性verifyCode 用来存放用户输入的验证码,并给其添加CCaptchaValidator验证。
class DataModel extends CFormModel { public $rating; public $verifyCode; public function rules() { return array( array('rating,verifyCode', 'safe'), array('verifyCode','captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()), ); } }
然后修改SiteController,添加actions方法,Captcha组件缺省使用CCaptchaAction,其缺省ID为captcha。
public function actions() { return array( 'captcha'=>array( 'class' => 'CCaptchaAction', )); }
下面就可以在View中添加Captcha组件了:
<div class="form"> <?php $form=$this->beginWidget('CActiveForm'); ?> <?php echo $form->errorSummary($model); ?> <?php if(CCaptcha::checkRequirements()): ?> <?php $this->widget('CStarRating',array( 'model'=>$model, 'attribute'=>'rating', 'name'=>'rating', 'value'=>3, )); ?> <p /> <?php echo $form->label($model,'verifyCode') ?> <p /> <?php $this->widget('CCaptcha'); ?> <p /> <?php echo $form->textField($model,'verifyCode') ?> <div class="row submit"> <?php echo CHtml::submitButton('Submit'); ?> </div> <?php endif ?> <?php $this->endWidget(); ?> </div><!-- form -->