关于 Laravel CSRF 的问题求助

首先这里有人提到过
http://stackoverflow.com/questions/2887578...

跟我的问题基本相同。

简单描述:

  1. 提交的表单中已经加入了 _token字段
  2. 开机-》打开浏览器-》进入网站,此时默认已登录,记住了上次的登录
  3. 然后提交了个form 就出现了 token miss match 的异常
public function handle($request, Closure $next)
{
    if ($this->isReading($request) || $this->tokensMatch($request))
    {
        return $this->addCookieToResponse($request, $next($request));
    }

    throw new TokenMismatchException;
}

抛出异常的位置,最后的那个throw,进一步跟入$this->tokensMatch方法发现

return StringUtils::equals($request->session()->token(), $token); 

这个反回false,也就是我每次产生的token和session中得token会不一致。

这里就不理解了,如果我浏览器一直开着,session不过期,那么每次提交又都会生成新的token,是不是每次都会验证失败?

想到这个地方有点乱了,是不是哪个地方进入误区了?
向大家求助....

update:

前面理解错了一个地方,csrf()那个函数原来就是从session中取的token,当成是每次随机生成了.这样的话可能不知道什么原因导致token变了。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 18
Summer

排版好乱, Markdown 不会用?

9年前 评论
Summer

排版很重要, 因为排版是在尊重查看帖子的人 :smile:

CSRF Token 存储在 Session 里, 每一次 Session 初始化的时候, 都会检查 _token 是否存在, 否的话 regenerateToken

file

下面是 regenerateToken 的定义:

file

可以理解为 CSRF Token 是依赖于 Session.

Session 过期, 或者 Session 里 _token 被删除的话, CSRF Token 就会被重新生成, 如果这个时候刚好有一个 无效的 _token 请求进来的话, 就会造成 Token Mismatch.

一般都是 Session 过期造成的, Session 过期时间 L4 默认设置如下:

file

9年前 评论
梦想星辰大海

哥也总结一发:

  • 表单没有传递token
  • 代码异常结束,导致session没有落地,比如中间件中exit,控制器的方法中exit
  • 你的代码跑在集群上面,但是你却没有共享session
6年前 评论

我也发现类似的问题,但场景不一样。

  • 1 同一台服务器上两个不同的虚拟主机,都运行laravel框架
  • 2 两个虚拟主机域名一样,只是目录名不同,如http://www.a.com/a/... http://www.a.com/b/...
  • 3 单独访问http://www.a.com/a/... 或 http://www.a.com/b/...是都正常
  • 4 先访问http://www.a.com/a/...中的一个表单,再打开http://www.a.com/b/...中的一个表单。然后提交http://www.a.com/a/...表单时,就抛csrf异常。
6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!