Php Laravel令牌不匹配异常数据库会话
从文件会话切换到数据库会话时,我的$request->input(_标记)与$request->session()->toke()不匹配 这会导致CSRF令牌不匹配异常。从数据库切换回文件时,不会出现不匹配的情况 有人知道我为什么会出现这种不匹配,以及可能如何解决它吗?:) 我所做的:Php Laravel令牌不匹配异常数据库会话,php,html,laravel,session,frameworks,Php,Html,Laravel,Session,Frameworks,从文件会话切换到数据库会话时,我的$request->input(_标记)与$request->session()->toke()不匹配 这会导致CSRF令牌不匹配异常。从数据库切换回文件时,不会出现不匹配的情况 有人知道我为什么会出现这种不匹配,以及可能如何解决它吗?:) 我所做的: 使用Laravel 5.0 PHP 5.6.30 php artisan会话:表:创建的Laravel会话表 作曲家转储自动加载 php artisan配置:清除 php arisan配置:缓存 My sess
使用Laravel 5.0
PHP 5.6.30 php artisan会话:表:创建的Laravel会话表 作曲家转储自动加载 php artisan配置:清除 php arisan配置:缓存 My session.php配置如下所示: VerifyCsrfToken\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_令牌
<input type="hidden" name="_token" id="_token" value="{!! csrf_token() !!}">
它们应该是不同的:)
- csrf令牌是防止csrf攻击的一种方法。这是一种攻击形式,如本例所示:
GET/pay50dollarToHarry
(非常愚蠢的示例)端点。当进入stackoverflow这样的论坛并发布如下图片时:
<img src="youdomain.com/pay50dollarToHarry />
他们应该是不同的:)
- csrf令牌是防止csrf攻击的一种方法。这是一种攻击形式,如本例所示:
GET/pay50dollarToHarry
(非常愚蠢的示例)端点。当进入stackoverflow这样的论坛并发布如下图片时:
<img src="youdomain.com/pay50dollarToHarry />
如果您使用的是Laravel5.4*并且碰巧遇到了这个问题,那么下面是您需要做的 1-更新你的.env文件
# file = .env in your project root
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=testdb
DB_USERNAME=db_user
DB_PASSWORD=secret_pass
SESSION_DRIVER=database
请注意此处的DB_连接设置,您将在下一步中需要该设置
2-更新config/session.php文件
Where connection PARM应保存在.env文件中用于DB_连接的字符串
# file = config/session.php
'driver' => env('SESSION_DRIVER', 'database'),
'connection' => 'mysql', // this is from DB_CONNECTION in .env file
3-生成会话表
php artisan session:table
// run the migration !!! very very important
php artisan migrate
4-如果出于某种原因决定不使用迁移而手动创建表,请使用此SQL。这是非常重要的一步,错误的表格会导致各种问题。
主要是不要犯错误,像往常一样手动创建一个id列为bigint的表,会话表是不同的
SQL for sessions表,如果要手动创建,则应运行该表
这应该可以解决将db设置为会话保存路径后出现的令牌不匹配异常。如果您使用的是Laravel 5.4*并且碰巧遇到了这个问题,下面是您需要执行的操作 1-更新你的.env文件
# file = .env in your project root
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=testdb
DB_USERNAME=db_user
DB_PASSWORD=secret_pass
SESSION_DRIVER=database
请注意此处的DB_连接设置,您将在下一步中需要该设置
2-更新config/session.php文件
Where connection PARM应保存在.env文件中用于DB_连接的字符串
# file = config/session.php
'driver' => env('SESSION_DRIVER', 'database'),
'connection' => 'mysql', // this is from DB_CONNECTION in .env file
3-生成会话表
php artisan session:table
// run the migration !!! very very important
php artisan migrate
4-如果出于某种原因决定不使用迁移而手动创建表,请使用此SQL。这是非常重要的一步,错误的表格会导致各种问题。
主要是不要犯错误,像往常一样手动创建一个id列为bigint的表,会话表是不同的
SQL for sessions表,如果要手动创建,则应运行该表
这将解决将db设置为会话保存路径后出现的令牌不匹配异常。您使用的是php artisan Service吗?会话令牌!=是的,没错。会话令牌与csrf令牌不同。但是为什么呢?:)怎么解决呢?因为它们不是一回事,它们有不同的用途。这很奇怪。因为当我切换回文件会话时,它们是相同的,例外情况不是thrown。您使用的是php artisan服务吗?会话令牌!=是的,没错。会话令牌与csrf令牌不同。但是为什么呢?:)怎么解决呢?因为它们不是一回事,它们有不同的用途。这很奇怪。因为当我切换回文件会话时,它们是相同的,异常不是thrownOkey,fair:),但我的问题仍然存在。为什么在VerifyCsrfToken.php第51行:切换到数据库会话时,我会得到TokenMismatchException?如果使用默认的csrf中间件(未更改)和
{{csrf_field()}}
在表单中,它会工作,保证Lavel 5.0有不同的版本(好的,公平的:),但我的问题仍然存在。为什么在VerifyCsrfToken.php第51行:切换到数据库会话时会出现令牌不匹配异常?如果您在表单中使用默认的csrf中间件(未更改)和{{csrf_field()}}
,它将起作用,这将确保Lavel 5.0有一个不同的版本,非常感谢。它引发了错误的CSRF_令牌不匹配。这只是数据库表结构:Id字段是int而不是text,这让我以自己的方式找到了错误。您还需要在.env
文件中将SESSION\u CONNECTION
设置为数据库连接名称。非常感谢。它引发了错误的CSRF_令牌不匹配。这只是数据库表结构:Id字段是int而不是text,这让我以自己的方式找到了错误。您还需要将.env
文件中的SESSION\u CONNECTION
设置为数据库连接名称。