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】:

从代码中,_tokenregenerateToken 唯一相关的出现在 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 4 CSRF 令牌不起作用?

Laravel + Vue.js (axios) - CSRF 令牌不匹配

Laravel 4.2 根据请求频率生成新的 CSRF 令牌?

在 laravel 5.4 中为某些路由禁用 csrf 令牌?不工作[重复]

Laravel Session 总是改变 Laravel 5.4 中的每个刷新/请求

如何使用 CSRF 令牌发布到 Laravel API?