116

我的注册页面正确显示了表单,其中 CsrfToken ( {{ csrf_field() }}) 出现在表单中)。

表单 HTML

<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
        {{ csrf_field() }}
        ....
</form>

我正在为用户使用内置身份验证。除了路由和重定向之外,没有改变任何东西。

当我提交表单时(也只是在重新加载之后),它给出了该页面由于不活动而过期。请刷新并重试。错误。

我是我错过了一件非常小的事情。但不确定它是什么。有什么帮助吗?

更新

发现问题。会话驱动程序设置为数组。将其更改为文件,现在错误消失了。但是如果我使用数组有什么问题?

4

20 回答 20

171

如果您直接从搜索中得到这个答案,请确保您已经使用{{ csrf_field() }}OP 将 csrf 令牌添加到您的表单中。


如果您将会话驱动程序设置为文件:

可能与 storage_path 不可写有关。如果您使用基于文件的会话,它会在此处存储有关令牌的会话数据。可以通过以下方式验证is_writable(config('session.files'))


对于 OP,会话驱动程序设置为数组。 数组仅用于测试。由于数据没有被持久化,它将无法在下一次请求时比较令牌。

阵列驱动程序在测试期间使用,并防止存储在会话中的数据被持久化。

https://laravel.com/docs/5.5/session#configuration


检查 config/session.php

最后,我刚刚遇到的一个问题是,我们有一个项目,它在 config/session.php 中有会话域和安全设置,但开发站点没有使用 HTTPS (SSL/TLS)。这导致了这个一般错误,因为 session.secure 默认设置为 true。

于 2017-09-10T14:44:27.927 回答
81

我在 Laravel 5.5 中遇到了同样的问题。就我而言,它发生在将路由从 GET 更改为 POST 之后。问题是因为我在切换到 POST 时忘记传递 CSRF 令牌。

您可以通过调用以下方式在表单中发布 CSRF 令牌:

 {{ csrf_field() }}

或者在 app/Http/Middleware/VerifyCsrfToken.php 中排除你的路由

 protected $except = [
        'your/route'
    ];
于 2017-09-17T07:55:20.697 回答
12

尝试所有这些。

composer dump-autoload
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
于 2017-09-10T14:39:04.483 回答
8

这是因为Illuminate\Session\TokenMismatchException 查看此代码示例如何正确处理它造成的:

https://gist.github.com/jrmadsen67/bd0f9ad0ef1ed6bb594e

于 2017-11-06T13:01:16.337 回答
6

我的情况解决了SESSION_DOMAIN,在我的本地机器上必须设置为xxx.localhost. 它导致与直接在 session.php 配置文件中设置SESSION_DOMAIN的生产冲突。xxx.com

于 2018-06-07T03:56:46.977 回答
4

一些信息存储在 cookie 中,这些信息与开发中的 laravel 早期版本相关。所以它与由另一个版本生成的 csrf 生成的令牌冲突。只需清除 cookie 并尝试一下。

于 2017-09-10T14:30:43.863 回答
4

我更改了存储权限,错误消失了。似乎缺乏许可是问题所在。

sudo chmod -R 775 storage/
于 2018-02-22T15:31:15.997 回答
4

对于那些仍然有问题并且没有任何帮助的人。注意 php.ini mbstring.func_overload 参数。它必须设置为 0。mbstring.internal_encoding 设置为 UTF-8。就我而言,这是一个问题。

于 2018-05-13T19:35:59.640 回答
3

添加@csrf表格并转到VerifyCsrfToken.php

app->Http->中间件->VerifyCsrfToken.php

protected $except = [
        'paste your route here'
    ];
于 2019-12-28T17:12:59.603 回答
2

就我而言,该站点在服务器上很好,但在本地却不行。然后我记得我正在研究安全网站。
所以在文件 config.session.php 中,将变量 secure 设置为 false

'secure' => env('SESSION_SECURE_COOKIE', false),
于 2018-01-17T08:16:12.777 回答
1

我想出了两个避免这些错误的解决方案 1) 通过添加 protected $except = ['/yourroute'] 可能从定义的根目录禁用 csrf 令牌检查。2)只需在内核中受保护的中间件组中注释 \App\Http\Middleware\VerifyCsrfToken::class 行

于 2018-07-03T12:11:29.670 回答
1

简短的回答

register为in添加路由条目app/Http/Middleware/VerifyCsrfToken.php

protected $except = [
        '/routeTo/register'
    ];

并使用以下命令清除缓存和缓存路由:

php artisan cache:clear && php artisan route:clear

细节

每次访问 Laravel 站点时,都会生成一个令牌,即使会话尚未启动。然后,在每个请求中,此令牌(存储在 cookie 中)将根据其过期时间进行验证,设置在文件中的SESSION_LIFETIME字段中config/session.php

如果您保持站点打开超过过期时间并尝试发出请求,则会评估此令牌并返回过期错误。因此,要在经过身份验证的用户功能(例如注册或登录)之外的表单上跳过此验证,您可以在app/Http/Middleware/VerifyCsrfToken.php.

于 2019-07-29T18:36:23.907 回答
0

确保在您的 Web 服务器上具有正确的系统时间。就我而言,流浪机器是在未来(1 月 26 日 14:08:26 UTC 2226),所以我的浏览器会话 cookie 中的时间当然已经在 200 多年前过期了。

于 2017-11-27T19:03:26.333 回答
0

我的应用程序有多个子域,会话 cookie 是它们之间的问题。清除 cookie 解决了我的问题。

另外,尝试设置SESSION_DOMAINin .env文件。使用您正在浏览的确切子域。

于 2018-01-05T14:59:15.093 回答
0

设置mbstring.func_overload = 2

它帮助了我

于 2018-06-28T10:12:48.007 回答
0

我有同样的问题,但问题不在于框架,而在于浏览器。我不知道为什么,但就我而言,谷歌浏览器会自动阻止 cookie。允许 cookie 后,问题得到解决。

于 2018-11-08T11:41:49.403 回答
0

很多时候发生这种情况是因为您正在测试回溯项目

于 2020-04-08T04:35:41.777 回答
0

解决方案:

使用隐身新标签,然后再次测试。

原因:

在我的情况下,另一个用户使用我的管理面板登录

于 2020-06-24T06:07:24.427 回答
0

我在 Linux-mint 上遇到了同样的问题,但后来意识到 htdocs 文件夹没有完全权限。所以我通过执行以下操作更改了 htdocs 文件夹中所有子目录的权限:sudo chown -c -R $USER:$USER /opt/lampp/htdocs/*

于 2020-08-29T08:48:25.227 回答
0

登录以连接到服务器。

搜索错误

发生错误:search false 你没有豌豆。

搜索请求更长。

于 2020-10-18T17:46:03.643 回答