Laravel 4 - CSRF 令牌永远不会改变
Posted
技术标签:
【中文标题】Laravel 4 - CSRF 令牌永远不会改变【英文标题】:Laravel 4 - CSRF token never changes 【发布时间】:2014-09-10 16:08:04 【问题描述】:我正在创建表单,不管我怎么做,CSRF _token 总是一样的!
我用没关系
Form::open([route' => 'login']) ]]
或者如果我使用
Form::token()
每次都是一样的。 即使在我成功提交表单之后。我认为它会被消耗并生成一个新的,但没有!
我错过了配置步骤吗?
注意:我知道如果laravel_session
重新生成,_token 是不同的,但据我了解,CRSF 令牌也是避免多个表单提交的机制,所以它应该每次刷新页面时都会更改,或者至少在一次成功提交后消耗,不是吗?
【问题讨论】:
请问CRSF token was also the mechanism to avoid multiple form submissions
你在哪里读到的?
这里也讨论过***.com/questions/17239586/…
虽然该帖子确实解释了一种避免重新提交表单的方法,但它没有解释有关令牌未被使用的行为。我想破解这个,因为它看起来像一个安全漏洞。
【参考方案1】:
没有必要为每个请求刷新 CSRF 令牌,每个会话生成令牌也是安全的。查看Owasp cheat sheet 以获得更好的解释。
可以为每个请求重新生成令牌,但可能会导致可用性问题。我认为这就是 Laravel 实现每会话令牌方法的原因。
【讨论】:
谢谢,这是一个相当详尽的解释。看来这最终是预期的行为。 如果我注销并重新登录,这算作会话更改吗?我的意思是如果我注销并重新登录,令牌会改变吗? @Rohan - 实际上这取决于用户注销时应用程序将执行的操作。从技术上讲,会话 cookie 可以在浏览器关闭之前保持有效,但通常会在用户注销时丢弃会话。【参考方案2】:从代码中,_token
或 regenerateToken
唯一相关的出现在 Illuminate/Session/Store 的第 89、551 和 571 行。出现的情况是:
public function start()
$this->loadSession();
if ( ! $this->has('_token')) $this->regenerateToken();
return $this->started = true;
public function token()
return $this->get('_token');
public function regenerateToken()
$this->put('_token', str_random(40));
这意味着,该令牌仅在会话中不存在时才会重新生成。如果你愿意,你必须自己重新生成它,即Session::forget('_token');
【讨论】:
以上是关于Laravel 4 - CSRF 令牌永远不会改变的主要内容,如果未能解决你的问题,请参考以下文章
Laravel + Vue.js (axios) - CSRF 令牌不匹配
Laravel 4.2 根据请求频率生成新的 CSRF 令牌?
在 laravel 5.4 中为某些路由禁用 csrf 令牌?不工作[重复]