CSRF验证出现Error:The CSRF token could not be verified.

我遇到一个关于CSRF的问题,总是出现Error:The CSRF token could not be verified.

[color="#FF0000"]我的VIEW代码是:[/color]

<div id="formcenter">

&lt;h2&gt;&lt;?php echo Yii::t('register', 'Registration Form'); ?&gt;&lt;/h2&gt;





&lt;p&gt;&lt;?php echo Yii::t('register', 'Please fill all required fields and hit the submit button once your done.'); ?&gt;&lt;/p&gt;





&lt;?php if(&#036;model-&gt;hasErrors()): ?&gt;


&lt;div class=&quot;errordiv&quot;&gt;


	&lt;?php echo CHtml::errorSummary(&#036;model); ?&gt;


&lt;/div&gt;


&lt;?php endif; ?&gt;





&lt;?php echo CHtml::form('', 'post', array('class'=&gt;'frmcontact')); ?&gt;





&lt;div&gt;


	


	&lt;?php echo CHtml::activeLabel(&#036;model, 'username'); ?&gt;


	&lt;?php echo CHtml::activeTextField(&#036;model, 'username', array( 'class' =&gt; 'textboxcontact tiptopfocus', 'title' =&gt; Yii::t('register', 'Enter your desired username (Min: 3 Max: 32)') )); ?&gt;


	&lt;?php echo CHtml::error(&#036;model, 'username', array( 'class' =&gt; 'errorfield' )); ?&gt;





	&lt;br /&gt;


	


	&lt;?php echo CHtml::activeLabel(&#036;model, 'password'); ?&gt;


	&lt;?php echo CHtml::activePasswordField(&#036;model, 'password', array( 'class' =&gt; 'textboxcontact tiptopfocus', 'title' =&gt; Yii::t('register', 'Enter your desired password (Min: 3 Max: 32)') )); ?&gt;


	&lt;?php echo CHtml::error(&#036;model, 'password', array( 'class' =&gt; 'errorfield' )); ?&gt;





	&lt;br /&gt;


	


	&lt;?php echo CHtml::activeLabel(&#036;model, 'password2'); ?&gt;


	&lt;?php echo CHtml::activePasswordField(&#036;model, 'password2', array( 'class' =&gt; 'textboxcontact tiptopfocus', 'title' =&gt; Yii::t('register', 'Confirm your password') )); ?&gt;


	&lt;?php echo CHtml::error(&#036;model, 'password2', array( 'class' =&gt; 'errorfield' )); ?&gt;





	&lt;br /&gt;


	


	&lt;?php echo CHtml::activeLabel(&#036;model, 'email'); ?&gt;


	&lt;?php echo CHtml::activeTextField(&#036;model, 'email', array( 'class' =&gt; 'textboxcontact tiptopfocus', 'title' =&gt; Yii::t('register', 'Enter your desired email address') )); ?&gt;


	&lt;?php echo CHtml::error(&#036;model, 'email', array( 'class' =&gt; 'errorfield' )); ?&gt;


	


	&lt;br /&gt;


	


	&lt;?php echo CHtml::activeLabel(&#036;model, 'verifyCode'); ?&gt;


	&lt;?php echo CHtml::activeTextField(&#036;model, 'verifyCode', array( 'class' =&gt; 'textboxcontact tiptopfocus', 'title' =&gt; Yii::t('register', 'Enter the text displayed in the image below') )); ?&gt;


	&lt;?php echo CHtml::error(&#036;model, 'verifyCode', array( 'class' =&gt; 'errorfield' )); ?&gt;


	&lt;br /&gt;


    


	&lt;?php &#036;this-&gt;widget('CCaptcha'); ?&gt;





	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;


	


	&lt;p&gt;


		&lt;?php echo CHtml::submitButton(Yii::t('global', 'Submit'), array('class'=&gt;'submitcomment', 'name'=&gt;'submit')); ?&gt;


	&lt;/p&gt;


&lt;/div&gt;





&lt;?php echo CHtml::endForm(); ?&gt;

</div>

[color="#FF0000"]我的CONTROL代码是:[/color]

<?php

/**

  • Register controller class

*/

class RegisterController extends SiteBaseController

{

/**


 * Controller constructor


 */


public function init()


{


	// Do not allow logged in users here


	if( Yii::app()-&gt;user-&gt;id )


	{


		&#036;this-&gt;redirect('index/index');


	}


	


	// Add page breadcrumb and title


	&#036;this-&gt;pageTitle[] = Yii::t('global', 'Register');


	&#036;this-&gt;breadcrumbs[ Yii::t('global', 'Register') ] = array('register/index');


	


	parent::init();


}





/**


 * List of available actions


 */


public function actions()


{


   return array(


      'captcha' =&gt; array(


         'class' =&gt; 'CCaptchaAction',


         'backColor' =&gt; 0xFFFFFF,


	     'minLength' =&gt; 3,


	     'maxLength' =&gt; 4,


		 'testLimit' =&gt; 3,


		 'padding' =&gt; array_rand( range( 2, 10 ) ),


      ),


   );


}





/**


 * Register action


 */


public function actionindex()


{


	&#036;model = new RegisterForm;


	


	if( isset(&#036;_POST['RegisterForm']) )


	{


		&#036;model-&gt;attributes = &#036;_POST['RegisterForm'];


		if( &#036;model-&gt;validate() )


		{


			// Save the member and redirect


			&#036;user = new Members;


			&#036;user-&gt;scenario = 'register';


			&#036;user-&gt;role = 'member';


			&#036;user-&gt;attributes = &#036;_POST['RegisterForm'];


			&#036;user-&gt;save();


			


			// Redirect


			Yii::app()-&gt;user-&gt;setFlash('success', Yii::t('register', 'Registration Completed. Please sign in.'));


			&#036;this-&gt;redirect('login/index');


		}


	}


	


	&#036;this-&gt;render('index', array('model'=&gt;&#036;model));


}

}

[color="#FF0000"]我的model是这样的:[/color]

<?php

/**

  • Register form model

*/

class RegisterForm extends CFormModel

{

/**


 * @var string - username


 */


public &#036;username;





/**


 * @var string - password


 */


public &#036;password;





/**


 * @var string - password2


 */


public &#036;password2;





/**


 * @var string - email


 */


public &#036;email;





/**


 * @var string - captcha


 */


public &#036;verifyCode;





/**


 * table data rules


 *


 * @return array


 */





public function rules()


{


	return array(


		array('username', 'match', 'allowEmpty' =&gt; false, 'pattern' =&gt; '/[A-Za-z0-9&#092;x80-&#092;xFF]+&#036;/' ),


		array('email', 'email'),


		array('email, username', 'unique', 'className' =&gt; 'Members' ),


		array('email, password, password2', 'required'),


		array('username, password, password2', 'length', 'min' =&gt; 3, 'max' =&gt; 32),


		array('password2', 'compare', 'compareAttribute'=&gt;'password'),


		array('email', 'length', 'min' =&gt; 3, 'max' =&gt; 55),


		array('verifyCode', 'captcha'),


	);


}





/**


 * Attribute values


 *


 * @return array


 */


public function attributeLabels()


{


	return array(


		'username' =&gt; Yii::t('members', 'Username'),


		'email' =&gt; Yii::t('members', 'Email'),


		'password' =&gt; Yii::t('members', 'Password'),


		'password2' =&gt; Yii::t('members', 'Password Confirmation'),


		'verifyCode' =&gt; Yii::t('members', 'Security Code'),


	);


}

}

按照YII的说明:

要显示一个表单,请使用CHtml::form而不要自己写HTML代码。因为CHtml::form可以自动地在表单中嵌入一个隐藏项,这个隐藏项储存着验证所需的随机数据,这些数据可在表单提交的时候发送到服务器进行验证。

那么:

(1)我已经将本机中的IE7的cookies开启了,可以排除cookie的问题。

(2)我上面的代码使用CHtml::form,应该是可以的啊?

为什么不行呢?应该如何修改呢?

谢谢各位的帮助啊!

我看到你下面有提示mail函数不可用! :rolleyes:

再说了,你好像是在同域下提交的啊,怎么有关于CSRF的问题了?

1、mail函数不可用,和csrf验证是否有关系啊?

我的想法是:mail函数是在验证之后发出的信息。

而csrf是表单提交后在跨页跳转时首先验证的内容。

mail函数应该不影响csrf的事情。。。。

这是我的想法,不知是否正确?

2、我是在本机localhost作为服务器,本机直接调试的。这个会不会有关系呢?

(以后我要部署肯定想做csrf,所以想先做好)

请帮我看看。。。感谢!感谢!

我一般测试的时候和你的方法是一样的,但是没有涉及到CSRF啊 :o

http://www.yiiframework.com/extension/mailer/

关于邮件服务器的话,因为windows默认是不带邮件服务器的,所以建议你使用PHPMailer发送邮件,挺好用的。

谢谢!

1\你的意思是不是说,mail函数不可用是造成CSRF验证失败的主要原因?

2\为了部署csrf的程序(表单验证),一般你是放在什么时候才调试呢?

也可能是mail函数引起的,你配置一下邮件服务器,或者使用PHPMailer发送

为什么还是CSRF错误?

麻烦大家研究研究我上边的代码。

抱歉抱歉啊,烦扰大家了,能帮帮我吗?

我刚才将mail的配置搞定,虽然没有出现邮件警告了(在邮件的log上看到系统正确处理了邮件)。

但是依然出现CSRF错误:

Error

The CSRF token could not be verified.

我的YII 环境配置检查中,只有一项没有通过,其他全部是绿色(为了解决这个问题,我专门配置好了)。

按照YII的说明,CHtml::form可以自动地在表单中嵌入一个隐藏项,这个隐藏项储存着验证所需的随机数据,这些数据可在表单提交的时候发送到服务器进行验证。

为什么还是CSRF错误?

麻烦大家研究研究我上边的代码。

抱歉抱歉啊,烦扰大家了,能帮帮我吗?