“由于不活动,页面已过期”-Laravel 5.5


111

我的注册页面正确显示了表单{{ csrf_field() }},并且表单中存在CsrfToken()。

表格HTML

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

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

当我提交表单时(也就是重新加载后),它表明该页面由于不活动而已过期。请刷新,然后重试。错误。

我是我想念的一件很小的事。但不确定是什么。有什么帮助吗?

更新资料

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


可能与storage_path不可写有关。如果您使用的是基于文件的会话,则在此处存储有关令牌的会话数据。
德文郡(Devon)

1
找到了问题。会话驱动程序设置为array。将其更改为文件,错误现在消失了。但是,如果我使用数组怎么办?
Sougata Bose


1
对于新版本的laravel,请使用@csrf解决问题。
Vuong Tran

Answers:


164

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


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

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


对于OP,会话驱动程序设置为array。 数组仅用于测试。由于数据不会持久保存,因此它将无法在下一个请求上比较令牌。

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

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


检查config / session.php

最后,我遇到的一个问题是,我们有一个项目,该项目的会话域和安全设置位于config / session.php中,但是开发站点未使用HTTPS(SSL / TLS)。这是导致此一般错误的原因,因为默认情况下session.secure设置为true。


3
好。但是目前它正在开发中。所以,如果我使用数组,为什么会给我这个错误?
Sougata Bose

@SougataBose测试未开发。阵列数据无法持久保存...
Devon

这就是应该正确通过DOC的原因。:)
Sougata Bose

我的问题没有解决。我确实做了基础。但是我正在使用自定义提供程序和服务。当我调用控制器方法时没有问题,但是当我在用post request调用的控制器中运行服务方法时,问题就出现了!
Behnam Azimi

1
我在会议上遇到了类似的问题,但在测试方面。原来,当我Carbon::setTestNow($time);在测试中使用时,我没有通过Carbon::setTestNow();事后清除它。
riotCode

77

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

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

 {{ csrf_field() }}

或在app / Http / Middleware / VerifyCsrfToken.php中排除您的路线

 protected $except = [
        'your/route'
    ];

2
csrf_field()形式存在。接受的答案描述了问题。谢谢。
Sougata Bose

1
在我的情况下,我收到了来自第三方的POST,因此无法添加csrf_field()。由于CSRF并不是我的考虑因素,因此在此路由中添加例外即可解决该问题。谢谢。
法比奥·杜克·席尔瓦

我的问题没有解决。我确实做了基础。但是我正在使用自定义提供程序和服务。当我调用控制器方法时没有问题,但是当我在用post request调用的控制器中运行服务方法时,就会出现问题!
Behnam Azimi

1
请不要禁用CSRF验证!拥有保护非常重要。了解如何正确发送令牌并保护已登录用户免受可能代表他们提交操作的恶意JavaScript的侵害。
德文郡



6

我的案件解决了SESSION_DOMAIN,必须将本地计算机设置为xxx.localhost。它可能会导致与生产发生冲突SESSION_DOMAINxxx.com这是直接设置在session.php文件的配置文件。


您正在使用哪个会话驱动程序?file还是cookie
KeitelDOG

4

一些信息存储在cookie中,该信息与正在开发的laravel的先前版本有关。因此,它与由其他人的版本生成的csrf生成的令牌冲突。只需清除cookie并尝试。


您能够<input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">在生成的html中看到某种代码吗?
Suresh Velusamy

在那里。找到了问题。会话驱动程序设置为数组。将其更改为文件,错误现在消失了。
Sougata Bose

4

对于那些仍然有问题但无济于事的人。注意php.ini mbstring.func_overload参数。必须将其设置为0。并将mbstring.internal_encoding设置为UTF-8。就我而言,这是一个问题。


非常感谢你!您的回答使我的大脑免于崩溃)
Rustembek Kaliyev

3

我将存储权限更改为错误。似乎缺少许可是问题所在。

sudo chmod -R 775 storage/

2
请小心递归使用此类开放权限。对于文件,我强烈建议不要使用775。目录通常为755,文件为644。
德文郡(Devon)

3

@csrf在表格中并转到VerifyCsrfToken.php

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

protected $except = [
        'paste your route here'
    ];

1

就我而言,该站点可以在服务器上正常运行,但不能在本地运行。然后我记得我当时在安全的网站上工作。
因此,在文件config.session.php中,将变量secure设置为false

'secure' => env('SESSION_SECURE_COOKIE', false),


0

确保Web服务器上的系统时间正确。以我为例,这种无所事事的机器是将来的(1月26日14:08:26 UTC 2226),因此,当然,我的浏览器会话cookie中的时间已在200多年前过期了。



0

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


0

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


0

简短答案

添加的路由条目registerapp/Http/Middleware/VerifyCsrfToken.php

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

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

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

细节

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

如果您将网站保持打开状态超过到期时间并尝试发出请求,则将评估此令牌,并且将返回到期错误。因此,要在经过身份验证的用户无法使用的表单(例如注册或登录)上跳过此验证,可以在中添加除外路由app/Http/Middleware/VerifyCsrfToken.php


1
如果该页面处理用户输入,则应通过CSRF检查。
Sougata Bose

@SougataBose实际上,在那种情况下,我认为最好使用验证码验证器作为Google reCAPTCHA
JC Gras

0

它发生的时间很多,因为您正在回溯测试项目


0

解:

使用无痕式新标签,然后再次进行测试。

原因:

在我的情况下,另一个用户使用我的管理控制台登录

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.