【问题标题】:How to disable cookies in Laravel 5?如何在 Laravel 5 中禁用 cookie?
【发布时间】:2024-04-14 06:55:01
【问题描述】:

我在 Laravel 5.1 上制作了单页应用程序。我使用 localStorage 来保存 API 密钥,我不需要 cookie。 Laravel 为我创建了两个 cookie:

  • XSRF 令牌
  • laravel_session

如果我在环境配置中将SESSION_DRIVER 设置为array,则不再生成laravel_session cookie。

但我认为XSRF-TOKEN cookie 可能有问题,因为我在VerifyCsrfToken 中间件类中发现了这段代码:

public function handle($request, Closure $next)
{
    if ($this->isReading($request) || $this->shouldPassThrough($request) || $this->tokensMatch($request)) {
        return $this->addCookieToResponse($request, $next($request));
    }

    throw new TokenMismatchException;
}

addCookieToResponse 方法看起来像这样:

protected function addCookieToResponse($request, $response)
{
    $config = config('session');

    $response->headers->setCookie(
        new Cookie(
            'XSRF-TOKEN', $request->session()->token(), time() + 60 * 120,
            $config['path'], $config['domain'], false, false
        )
    );

    return $response;
}

似乎无论如何它都会设置这个cookie。我可以禁用这个中间件,但我想用它来验证带有 HTTP 标头的 CSRF 令牌。我可以完全禁用 cookie 吗?

【问题讨论】:

  • 如果你使用 laravel 来回 API 使用令牌,为什么不完全禁用 VerifyCsrfToken 中间件?这会使用您不关心的 cookie。您可以通过转到 app/http/Kernel.php 并注释该行来禁用
  • 只是为了了解更多背景信息,想要禁用 cookie 的原因是什么?
  • @ExoticChimp 有一项法律规定,如果您使用任何 cookie,则必须告知用户有关 cookie 的信息。我不需要它们,所以我宁愿禁用它们并摆脱“我们正在使用 cookie”信息:)
  • 对网站运行至关重要的第一方 cookie 是豁免的,并且不需要您(欧盟 cookie 法)通知用户(取决于他们的性质)。在这种情况下,默认的 Laravel 会话 cookie 将被免除。法律刚刚放宽了
  • 是的,这似乎引起了很多混乱。这是一篇让您入门的好文章:ec.europa.eu/ipg/basics/legal/cookies/index_en.htm

标签: php cookies laravel-5 single-page-application


【解决方案1】:

只需将app\Http\Kernel.php 中与cookie 和会话相关的行注释掉即可。以下是我找到的;

\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,

希望对你有帮助。

【讨论】:

  • 当然,您可以通过 HTTP 标头发送 CSRF 令牌,但您必须将令牌存储在客户端。因此,如果您愿意禁用 cookie,则必须弄清楚如何传输和存储从后端接收到的令牌。也许 localstorage 可以派上用场。您也需要发送程序,即设置正确的 HTTP 标头。
  • 只需在标题中使用<meta name="csrf-token" content="{{ csrf_token() }}">,然后在ajax 调用中使用headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') },(jquery 示例)。但是,laravel 仍然会抛出错误"Session store not set on request.",,我不知道为什么
【解决方案2】:

从 5.7.0 开始,XSRF-TOKEN cookie 现在是可选的。为了禁用它,您只需在 /app/Http/Middleware/VerifyCsrfToken.php 文件中设置以下内容。

protected $addHttpCookie = false;

https://github.com/laravel/framework/commit/3ff7040663b81d8f01939edd2cb67d3214ec91b8

【讨论】:

    【解决方案3】:

    我刚刚在 Laravel 6.0 中对此进行了测试。
    要运行 CSRF 中间件,并且 Laravel 不添加任何 cookie,您需要禁用(注释掉)以下中间件:

    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    

    这将阻止 Laravel 添加 laravel_session cookie。

    要禁用添加XSRF-TOKEN cookie,请打开\App\Http\Middleware\VerifyCsrfToken::class 中间件并将$addHttpCookie 属性设置为false

    【讨论】:

    • 但是当你不使用StartSession时,你总是会收到消息":"Session store not set on request。",在尝试验证csrftoken时做一些发布请求时。我想使用会话,但是不要使用cookie,像普通的phpsession_start()不需要cookie。太荒谬了,这在laravel中是如此困难
    【解决方案4】:

    小心,删除 StartSession 中间件确实会删除整个 csrf 令牌,因为 csrf_token 函数 fetch app('session')->token()。

    但是,当 StartSession 中间件尝试设置 cookie 时,它​​会检查驱动程序是否不为空 (sessionIsPersistent),但如果我将其设置为空,我无法通过“无法解决” Illuminate\Session\SessionManager 的 NULL 驱动程序

    【讨论】:

      最近更新 更多