关于 Laravel CSRF 的问题求助
首先这里有人提到过
http://stackoverflow.com/questions/2887578...
跟我的问题基本相同。
简单描述:
- 提交的表单中已经加入了 _token字段
- 开机-》打开浏览器-》进入网站,此时默认已登录,记住了上次的登录
- 然后提交了个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变了。
关于 LearnKu
排版好乱, Markdown 不会用?
排版很重要, 因为排版是在尊重查看帖子的人 :smile:
CSRF Token 存储在 Session 里, 每一次 Session 初始化的时候, 都会检查
_token是否存在, 否的话regenerateToken下下面是
regenerateToken的定义:可以理解为 CSRF Token 是依赖于 Session.
Session 过期, 或者 Session 里
_token被删除的话, CSRF Token 就会被重新生成, 如果这个时候刚好有一个无效的 _token请求进来的话, 就会造成Token Mismatch.一般都是 Session 过期造成的, Session 过期时间 L4 默认设置如下:
哥也总结一发:
exit,控制器的方法中exit我也发现类似的问题,但场景不一样。