【发布时间】:2017-07-06 15:30:51
【问题描述】:
从文件切换到数据库会话时,我的 $request->input(_token) 与 $request->session()->toke() 不匹配。
这会导致 CSRF TokenMismatchException。当从数据库切换回文件会话驱动程序时,不会发生不匹配。
有谁知道我为什么会出现这种不匹配以及如何解决它? :) 我做了什么:
使用 Laravel 5.0
PHP 5.6.30
php artisan session:table : 创建 Laravel 会话表 作曲家转储自动加载 php工匠配置:清除 php arisan 配置:缓存
我的 session.php 配置如下所示:
return [
'driver' => 'database',
'lifetime' => 120,
'expire_on_close' => false,
'encrypt' => false,
'files' => storage_path().'/framework/sessions',
'connection' => null,
'table' => 'laravel_session',
'lottery' => [2, 100],
'cookie' => 'laravel_session',
'path' => '/',
'domain' => null,
'secure' => false,
];
VerifyCsrfToken Illuminate\Foundation\Middleware
protected function tokensMatch($request)
{
$tok = $request->input('_token') ; //4ExGXl9mRM75d7brfQhgIWcQzsSVjnUHDoDcKJxp
$tokhead = $request->header('X-CSRF-TOKEN');
$sessToken = $request->session()->token();//57DLb3uTs8brVPKpBxor14Hg0ZvQPpYW3flktP86
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
if ( ! $token && $header = $request->header('X-XSRF-TOKEN'))
{
$token = $this->encrypter->decrypt($header);
}
return StringUtils::equals($request->session()->token(), $token);
切换到数据库sesseio驱动后,数据库表填充数据:
SELECT id, payload, last_activity, user_id FROM kartserver_2.laravel_session;
d33d5782e1eed56771baa56f9410a24b9e628ff6 YToxNzp7czo2OiJfdG9rZW4iO3M6NDA6Ikh6dUc4WG1PUDFZalRHY0QwcW5QZzlFSGRUSkJ3ZmVOUkVjM0RJVk0iO3M6NToiZmxhc2giO2E6Mjp7czozOiJvbGQiO2E6MDp7fXM6MzoibmV3IjthOjA6e319czoyMDoicGFzc3dvcmRSZXF1aXJlbWVudHMiO086NDE6Ikhhd2tTb2Z0d2FyZVxTZWN1cml0eVxQYXNzd29yZFJlcXVpcmVtZW... 1487315670 1862
我在 html 中生成 csrf_tokens
<input type="hidden" name="_token" id="_token" value="{!! csrf_token() !!}">
【问题讨论】:
-
你在使用 php artisan serve 吗?
-
会话令牌!= csrf 令牌
-
是的,没错。会话令牌与 csrf-token 不同。但为什么? :) 以及如何解决它
-
因为它们根本不是同一种东西,它们的用途不同。
-
这很奇怪。因为当我切换回文件会话时,它们是相同的并且不会抛出异常
标签: php html laravel session frameworks