Laravel 6 会话和 CSRF Coo​​kie 未设置——每次页面加载的会话数据库中的新条目

Posted

技术标签:

【中文标题】Laravel 6 会话和 CSRF Coo​​kie 未设置——每次页面加载的会话数据库中的新条目【英文标题】:Laravel 6 Session and CSRF Cookies Not Being Set -- New Entry in Session DB for Each Page Load 【发布时间】:2020-09-05 02:01:08 【问题描述】:

我是 Laravel 的新手,并且有一个 Laravel 6 应用程序,其中会话没有按预期运行。每当我提交表单时,它都会导致 419 页面过期错误。

@csrf 包含在每个表单中,所以这不是问题。

相反,我看到的是浏览器中没有设置会话 cookie 和 XSRF-TOKEN cookie。但是,我确实看到会话在每次页面加载时都会在数据库中创建一个新 ID。

session.php 配置文件是默认配置文件:

    'driver' => env('SESSION_DRIVER', 'file'),
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path('framework/sessions'),
    'connection' => env('SESSION_CONNECTION', null),
    'table' => 'sessions',
    'store' => env('SESSION_STORE', null),
    'cookie' => env(
        'SESSION_COOKIE',
        Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
    ),
    'path' => '/',
    'domain' => env('SESSION_DOMAIN', null),
    'secure' => env('SESSION_SECURE_COOKIE', false),
    'http_only' => true,
    'same_site' => null,

VerifyCsrfToken.php 中间件文件是默认的:

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware

    /**
     * Indicates whether the XSRF-TOKEN cookie should be set on the response.
     *
     * @var bool
     */
    protected $addHttpCookie = true;

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
    ];

我在 .env 中更改的唯一会话变量是:

SESSION_DRIVER=database
SESSION_COOKIE=lsession
SESSION_LIFETIME=43200

除了确认@crsf 令牌包含在每个表单中之外,我已经尝试过:

在多个浏览器中测试 重新启动我的机器并重试 用php artisan cache:clear && php artisan config:cache清除缓存 在文件和数据库会话驱动程序之间来回切换

这些都不起作用。

还有什么可能导致 session/csrf cookie 无法设置?

提前非常感谢!

【问题讨论】:

你能把你的表格包括在里面吗? 【参考方案1】:

这与表格无关。这对我来说是一个愚蠢的举动,所以发布这个答案以防其他人偶然发现同样的问题。

在我的一个文件中,<?php 标记之前有一个空格。该空间在 HTTP 标头之前被发送到浏览器,因此没有设置任何 cookie。

哇!

【讨论】:

【参考方案2】:

<head> 中,最好是在您加载的每个 Blade 文件中包含的 head.blade.php 中,尝试添加:

<meta name="csrf-token" content=" csrf_token() ">

【讨论】:

以上是关于Laravel 6 会话和 CSRF Coo​​kie 未设置——每次页面加载的会话数据库中的新条目的主要内容,如果未能解决你的问题,请参考以下文章

Laravel CSRF 保护

跨站点请求伪造(CSRF)总结和防御

Laravel - CSRF 与会话令牌不匹配

DVWA——CSRF 跨站请求伪造

Laravel CSRF 保护

Laravel 6 Passport CSRF 令牌不匹配