Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel令牌不匹配异常数据库会话_Php_Html_Laravel_Session_Frameworks - Fatal编程技术网

Php Laravel令牌不匹配异常数据库会话

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

从文件会话切换到数据库会话时,我的$request->input(_标记)与$request->session()->toke()不匹配

这会导致CSRF令牌不匹配异常。从数据库切换回文件时,不会出现不匹配的情况

有人知道我为什么会出现这种不匹配,以及可能如何解决它吗?:) 我所做的:


使用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
设置为数据库连接名称。