yii2 csrf 验证中csrf每次请求都会更改吗

在Yii框架中,为了防止csrf攻击,封装了CSRF令牌验证。
只需要在主配置文件中进行简单的配置,就可以实现CSRF的验证。
'components'=&array(
'request'=&array(
// Enable Yii Validate CSRF Token
'enableCsrfValidation' =& true,
将enableCsrfValidation设置为true了之后,使用Yii表单生成页面的时候,如果表单的提交方式为POST,是都会在页面中添加一个隐藏字段
&div style=&display:none&&
&input type=&hidden& value=&a429b6c0f1dfe2672c7& name=&YII_CSRF_TOKEN& /&
自己写的表单需要手动添加隐藏字段
&input type=&hidden& value=&&?php echo Yii::app()-&getRequest()-&getCsrfToken(); ?&& name=&YII_CSRF_TOKEN& /&
用户在提交表单的同时,将该字段提交给服务器端,Yii框架会将该有客户端提交过来的隐藏字段和客户端提交过来的Cookie中的YII_CSRF_TOKEN值进行比较。
相同则通过继续执行,不相同则会抛出400异常:&The CSRF token could not be verified.&。
上面的方法是将客户端提交过来的值和客户端的Cookie中的值进行比较,并不是最为安全的方法。
目前更为安全的方式,是将客户端提交过来的值和Session中的值进行比较,这就需要重写CHttpRequest类了。具体步骤如下:
1.重写CHttpRequest:
创建一个类HttpRequest继承于CHttpRequest,并将该类存放在
protected/components 下。
重写CHttpRequest的 getCsrfToken() 和 validateCsrfToken($event) 方法。
private $_csrfT
public function getCsrfToken()
if($this-&_csrfToken===null)
$session = Yii::app()-&
$csrfToken=$session-&itemAt($this-&csrfTokenName);
if($csrfToken===null)
$csrfToken = sha1(uniqid(mt_rand(),true));
$session-&add($this-&csrfTokenName, $csrfToken);
$this-&_csrfToken = $csrfT
return $this-&_csrfT
public function validateCsrfToken($event)
if($this-&getIsPostRequest())
// only validate POST requests
$session=Yii::app()-&
if($session-&contains($this-&csrfTokenName) && isset($_POST[$this-&csrfTokenName]))
$tokenFromSession=$session-&itemAt($this-&csrfTokenName);
$tokenFromPost=$_POST[$this-&csrfTokenName];
$valid=$tokenFromSession===$tokenFromP
if(!$valid)
throw new CHttpException(400,Yii::t('yii','The CSRF token could not be verified.'));
2.修改配置文件main.php:
'components' =& array(
'request' =& array(
'class' =& &#ponents.HttpRequest',
'enableCsrfValidation' =& true,
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:51423次
积分:1283
积分:1283
排名:千里之外
原创:66篇
转载:64篇
(1)(1)(3)(2)(1)(7)(2)(14)(15)(15)(4)(5)(4)(1)(2)(2)(3)(6)(7)(3)(8)(2)(12)(6)(6)yii2 防止重复提交
之前的做法 就是把按钮给禁用掉, 突然 想起文本框里敲回车 还是会提交表单. 现在打算用一变量来标记是否已经点击了提交. 我想知道的是 还有没别的 更优雅的方法? 之前的做法 就是把按钮给禁用掉, 突然 想起文本框里敲回车 还是会提交表单. 我一般也是采用这种方式,但不知你的实现手法是否和我的一样. 『文本框里敲回车』实际是触发form表单里的&button type ...
再是用ajax提交表单的时候,经常出现重复提交,有通过token的,有提交后跳转页面的.想了解一下现在都有什么方法可以做这个? 请搜索 CSRF 你点击按钮的时候,给这个按钮加上一个class,比如ub-click-able,如果有这个class,点击这个按钮不触发Ajax事件.当Ajax处理返回之后,你去掉这个class. 提交后加 disabled 属性. var lo ...
关于防止表单重复提交的做法有很多,本人知道的有如下,只是简单讲讲,大家觉得什么办法最简单又有效? 1.有redis的环境 把提交的动作action,参数之类的作为redis的key,存进redis,设置一个很短的缓存时间,提交的时候判断如果存在这个key,说明是重复提交数据. 2.jquery前端判断 除了在程序端判断重复提交外,在页面前端也加一层措施,如点击提交按钮,按钮 ...
如题,在不使用验证码的情况下! 所有&通过前台JS,约束提交行为本身不会重复发生&的答案都是彻底错误的. 弱网络时如果POST请求到达了服务器响应却没回去,此时客户端报浏览器原生的超时错误,访客按F5重发,你的JS如之奈何?! JS阻止重复点击按钮,仅仅是&锦上添花&的体验改进而已,根本称不上&防重复提交&的可靠方 ...
在前端放一个文本域,用来让用户输入邮箱帐号,然后提交给后端进行邮件的发送任务 问题是如果用户(恶意)复制进去了几万条邮箱帐号,然后提交了,然后用户又把同样的几万条再次复制进去,重新提交,这样问题就大了 允许用户多次提交,但对于其每次提交的数据都是不可控的.... 这是怎样一个应用场景,可以大概描述一下吗? 如果仅仅是防止重复提交,将邮件地址放进数据库中做比对可以解决吗? 在 ...
如题: Flask如何解决F5刷新重复提交的问题,谢谢! 表单提交完成后,使用redirect而不是直接返回表单页面 如果需要返回信息,则使用flash域传递消息 flash('You were successfully logged in') return redirect(url_for('index')) 参考:http://flask.pocoo.org/docs/ ...
表单重复提交是否可以稳定模拟重现? 可以用 Ajax 请求模拟表单提交,重复多少次都行. 提交之後,按返回,再提交,很多表單的噩夢,這也是爲什麼人們想要禁用瀏覽器歷史.
网站做个活动,活动中用户可以提交信息(无需登录),如何限制用户重复提交? 限制每台电脑只能提交一次信息 在进入前端页面前 给请求的session中加入令牌(也就是加入参数),提交表单时核对令牌和服务器端令牌是否相等,相等则提交并抹去令牌,否则不提交 记录ip,判断是否重复 记录ip地址和useragent到数据库,提交之前检测一下是否有相同的,然后写一个cookie到该用户 ...
大家有哪些防止表单重复提交的妙招,说来听听呗!!详细点,谢谢 禁掉提交按钮 表单提交后使用Javascript使提交按钮disable.这种方法防止心急的用户多次点击按钮.但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了. Post/Redirect/Get模式 在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式.简 ...
前端问题,在手机浏览器访问网页,在表单选择照片,然后提交,当选择本地相册时提交ok,但选择调摄像头拍照提交时,发现不断重复提交直至服务器超时,到数据库看了下,一个照片被提交了4次....有木有前端朋友给说说为什么. 在submit时添加一个行为,点submit后直接让submit button disable掉.
有时候,会因为网路过慢,导致用户重复提交动作. 这种情况下,数据库就会有多条重复的记录,如何避免这种问题呢? 这是典型的Http幂等问题.最简单的办法是为每次提交在提交之前生成Ticket,服务端对Ticket进行验证 .即提交(POST)类似的Url:/Resource/ResourceId/Ti... 分前端和后端处理吧: 1.提交后将按钮d ...
&form method=&post& action=&{{ route('card.product.store') }}& accept-charset=&utf-8&& &input type=&hidden& name=&_token& value=& ...
表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如:点击提交按钮两次.点击刷新按钮.使用浏览器后退按钮重复之前的操作,导致重复提交表单.使用浏览器历史记录重复提交表单.浏览器重复的HTTP请求. 几种防止表单重复提交的方法禁掉提交按钮.表单提交后使用Javascript使提交按钮disable.这种方法防止心急的用户 ...
偶然发现, 好像Rails默认没有防止表单重复提交的功能.rails new repeat_testrails g scaffold user name:string age:integeradd sleep 5 in create user action. # POST /users# POST =User.n ...
把重复提交数据的控制放在后端,怎么设计呢? 让客户端提交数据时携带一个不重复的数据id,服务器根据id直接丢弃已经收到数据 放在本地数据库中,每次提交做比较
我在回复的时候,连续点两次按钮,发现都提交了,虽然受到了 notice 警告不能重复提交...
token用于常用的表单防止重复提交及站外提交的一个常用的处理方式了,下文我们一起来看一个PHP表单增加token验证,防止站外及重复提交例子.原理在于生成一个随机字符串放在session里.提交表单后来验证这个字符串.可以做到防止他人自己写form来欺骗提交,重复提交或者双击提交.Token.php&?php /* * Created on
防止表单重复提交的解决方案非常的简单,我们下面两个例子都是生成一个随机的token验证用户是不是由我们站内提交并且进行重复验证即可实现了.在网上搜索了一下有很多站长都这样说的1.提交按钮置disabled当用户提交后,立即把按钮置为不可用状态.这种用js来实现.提交前代码如下: 代码如下 $(&#submit&).attr('disabled','tru ...
以前我们写防止重复提交就是在js中加一个判断判断用户提交后不能再进行提交了,其实这样做只能防止简单的重复揭,下面我来介绍Struts2防止表单重复提交的方法,原理大概是:你验证码一样每次生成一个序列标识号在隐藏域的表单中,然后我们进行校验即可了.先要配置拦截器,拦截器用于控制重复提交内容!其实原理很简单,就是在表单内生成一个序列,判断是否为新的序列,如果是之前的序列,则证明 ...
一.简介Struts2使用token拦截器来检查表单是否重复提交,采用的是同步令牌的方式.同步令牌方式:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配.在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换.这样如果用户回退到刚才的提交页面并再次 ...3450人阅读
在Yii框架中,为了防止csrf攻击,封装了CSRF令牌验证。
只需要在主配置文件中进行简单的配置,就可以实现CSRF的验证。
'components'=&array(
'request'=&array(
// Enable Yii Validate CSRF Token
'enableCsrfValidation' =& true,
),将enableCsrfValidation设置为true了之后,Yii在生成页面的时候,如果表单的提交方式为POST,是都会在页面中添加一个隐藏字段
&div style=&display:none&&&input type=&hidden& value=&a429b6c0f1dfe2672c7& name=&YII_CSRF_TOKEN& /&&/div&为GET时,需要自己手工地在页面添加上述的隐藏字段。
&input type=&hidden& value=&&?php echo Yii::app()-&getRequest()-&getCsrfToken(); ?&& name=&YII_CSRF_TOKEN& /&用户在提交表单的同时,将该字段提交给服务器端,Yii框架会将该有客户端提交过来的隐藏字段和客户端提交过来的Cookie中的YII_CSRF_TOKEN值进行比较。
相同则通过继续执行,不相同则会提示错误&The CSRF token could not be verified.&。
上面的方法是将客户端提交过来的值和客户端的Cookie中的值进行比较。
并不是最为安全的方法。目前更为安全的方式,是将客户端提交过来的值和Session中的值进行比较,
这就需要重写CHttpSession类了。具体步骤如下:
1.重写CHttpSession。
创建一个类HttpSession重写CHttpSession,并将该类存放在 protected/components 下。
复写 getCsrfToken() 和 validateCsrfToken($event) 方法。
private $_csrfT
public function getCsrfToken()
if($this-&_csrfToken===null)
$session = Yii::app()-&
$csrfToken=$session-&itemAt($this-&csrfTokenName);
if($csrfToken===null)
$csrfToken = sha1(uniqid(mt_rand(),true));
$session-&add($this-&csrfTokenName, $csrfToken);
$this-&_csrfToken = $csrfT
return $this-&_csrfT
public function validateCsrfToken($event)
if($this-&getIsPostRequest())
// only validate POST requests
$session=Yii::app()-&
if($session-&contains($this-&csrfTokenName) && isset($_POST[$this-&csrfTokenName]))
$tokenFromSession=$session-&itemAt($this-&csrfTokenName);
$tokenFromPost=$_POST[$this-&csrfTokenName];
$valid=$tokenFromSession===$tokenFromP
if(!$valid)
throw new CHttpException(400,Yii::t('yii','The CSRF token could not be verified.'));
}2.修改配置文件main.php
'components' =& array(
'request' =& array(
'class' =& 'ponents.HttpRequest',
'enableCsrfValidation' =& true,
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:70774次
积分:1725
积分:1725
排名:第15706名
原创:96篇
转载:53篇
(2)(4)(4)(7)(3)(1)(11)(10)(2)(1)(1)(1)(6)(1)(3)(1)(12)(2)(6)(6)(7)(5)(5)(8)(6)(12)(1)(10)(11)

我要回帖

更多关于 yii csrf 的文章

 

随机推荐