yii2利用csrf防止表單重復(fù)提交
首先,默認(rèn)情況下,yii2的csrf驗(yàn)證是通過cookie來保存token驗(yàn)證的,要實(shí)現(xiàn)防止表單重復(fù)提交,得先把這個(gè)方式改成session。
修改項(xiàng)目配置即可實(shí)現(xiàn) ? ? ? ? ? ?(推薦學(xué)習(xí):yii框架)
'components'?=>?[ 'request'?=>?[ 'enableCsrfCookie'?=>?false ] ]
然后,csrf驗(yàn)證通過后,在進(jìn)入下一次get請(qǐng)求之前是不會(huì)刷新或者清除session里保存的那個(gè)csrf token的,而驗(yàn)證csrf的地方在控制器的beforeAction方法里,源碼?yiiwebController?如下
/** *?@inheritdoc */ public?function?beforeAction($action) { if?(parent::beforeAction($action))?{ if?($this->enableCsrfValidation?&&?Yii::$app->getErrorHandler()->exception?===?null?&&?!Yii::$app->getRequest()->validateCsrfToken())?{ throw?new?BadRequestHttpException(Yii::t('yii',?'Unable?to?verify?your?data?submission.')); } return?true; } ? return?false; }
改源碼當(dāng)然不好,所以建個(gè)新控制器繼承該控制器實(shí)現(xiàn)beforeAction方法
public?function?beforeAction($action) { if?(parent::beforeAction($action))?{ if?($this->enableCsrfValidation)?{ Yii::$app->getRequest()->getCsrfToken(true); } return?true; } ? return?false; }
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END