我是Laravel的新手,我有一个我不明白的问题。 我的项目中有一个日志表单,我的方法是 POST 。当我尝试请求时,结果是:
'由于不活动,页面已过期。请刷新并尝试 再次'。
但如果我将方法更改为 GET ,它可以正常工作。
有人可以告诉我为什么会这样,以及如何解决它?因为我当然需要POST方法。
答案 0 :(得分:151)
此问题来自CSRF令牌验证失败。因此,要么您没有发布一个,要么发布了错误的一个。
它适用于GET的原因是,对于Laravel中的GET路由,没有发布CSRF令牌。
您可以通过调用以下方式在表单中发布CSRF令牌:
{{ csrf_field() }}
或在app/Http/Middleware/VerifyCsrfToken.php
中排除您的路线(不建议由于安全):
protected $except = [
'your/route'
];
答案 1 :(得分:31)
在我的情况下,我收到了相同的错误消息,然后发现我错过了为表单字段添加csrf_token
。然后添加csrf_token
。
使用将成为
的表单助手{{ csrf_field() }}
或者没有表格助手,
<input type="hidden" name="_token" value="{{ csrf_token() }}">
如果这不起作用,那么 -
刷新浏览器缓存
现在可能会有效,谢谢。
Laravel 5.6更新
Laravel集成了新的@csrf
而不是{{ csrf_field() }}
。现在看起来更加美好。
<form action="">
@csrf
...
</form>
答案 2 :(得分:7)
无论何时在应用程序中定义HTML表单,都应在表单中包含隐藏的CSRF令牌字段,以便CSRF保护中间件可以验证请求。您可以使用csrf_field
帮助程序生成令牌字段:
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
它不起作用,然后刷新浏览器缓存,现在它可能会起作用,
有关详细信息,请打开链接: - CSRF Protection in Laravel 5.5
<强>更新强>
Laravel 5.6使用Blades模板,非常简单。
<form method="POST" action="/profile">
@csrf
...
</form>
有关详细信息,请打开链接: - CSRF Protection in Laravel 5.6
答案 3 :(得分:3)
这是因为您使用的是Laravel安装中的默认CSRV中间件。要解决此问题,请从Kernel.php中删除此行:
\App\Http\Middleware\VerifyCsrfToken::class,
如果您构建API,这很好。但是,如果您要构建网站,则这是安全验证,因此请注意其风险。
答案 4 :(得分:3)
验证您的config / session.php文件是否包含此行
'domain' => env('SESSION_DOMAIN', null),
然后删除.env文件中的SESSION_DOMAIN
行
答案 5 :(得分:2)
尝试了几种解决问题的不同解决方案,但没有成功。
我遇到的问题是从laravel 5.0升级到5.5而忘记更新config / session.php
如果有人遇到问题,请尝试更新config / session.php以匹配您正在运行的Laravel上的版本
答案 6 :(得分:2)
在我的情况下,我的一个配置文件中hvshow(holoviews_object, 'bokeh')
前面有'空格'。
这解决了我的问题。
答案 7 :(得分:2)
答案 8 :(得分:2)
答案 9 :(得分:1)
只需将此代码放在表单
中即可<input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>" />
答案 10 :(得分:1)
我遇到了同样的错误,所以我刚从我的.env文件中删除了这一行
SESSION_DRIVER = yourwebsite.com
答案 11 :(得分:1)
就我而言,我添加了ob_start();位于服务器上 index.php 的顶部,一切似乎都正常。
答案 12 :(得分:1)
如果您的配置已设置:SESSION_DRIVER = file,您必须检查您的会话目录是否可写。检查存储/框架/会话
答案 13 :(得分:1)
仍有人遇到此问题,请在表单中使用以下代码,如下所示。
echo '<input type = "hidden" name = "_token" value = "'. csrf_token().'" >';
答案 14 :(得分:1)
首先,在表单中包含csrf。
{{ csrf_field() }}
如果问题仍未解决,请在index.php的开头使用ob_start();
。
<?php ob_start();
答案 15 :(得分:0)
就我而言,这似乎是Web浏览器(适用于Android的Firefox)或具有完整存储空间的智能手机中的问题。在其他浏览器和设备中,它可以工作。顺便说一句,该问题仅在我通过表单发送文件时发生,我意识到我目前无法在https://filebin.net之类的任何网站上通过此浏览器从智能手机上传文件。
答案 16 :(得分:0)
我们通过从Router.php复制路由而不是使用Auth :: routes()来实现,这些是您需要的路由:
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
答案 17 :(得分:0)
我最近遇到了这个问题,尝试了这里提出的所有解决方案(以及互联网),但都没有成功5天。
在我的情况下,我的环境:
Laravel :5.5
PHP :7.2
SSL :生产
Apache
CENTOS
问题是我已经使用git --bare存储库和ansimble自动化了部署。
所有推送时的文件夹均具有权限 0775 (从git用户继承)。运行ansinble时,它将此权限复制到所有文件夹。例如,在进行安装时,所有供应商文件夹也都具有此权限。
csrf 具有阻止被认为不安全的内容的策略,尤其是在使用加密环境(SSL)的情况下。
仅当我决定手动执行部署,压缩项目,上载,解压缩并运行命令以生成缓存和依赖项时,我才意识到问题。然后我意识到这种方式所有文件夹都具有权限 0755 (从系统用户继承)。这是被认为是安全的默认权限。
答案 18 :(得分:0)
如果仍在寻找此问题的答案。对我来说,这发生在我在本地服务器和生产服务器之间切换并登录两个站点时。要解决此问题,只需清除会话即可。
只需在'expire_on_close' => true
中设置config\session.php
并重新启动浏览器
答案 19 :(得分:0)
从CSRF保护中排除URI:
有时您可能希望从CSRF保护中排除一组URI。例如,如果您正在使用Stripe处理付款并使用其Webhook系统,则您将需要从CSRF保护中排除您的Stripe Webhook处理程序路由,因为Stripe不知道要发送到您的路由的CSRF令牌。
通常,您应将这些类型的路由放置在RouteServiceProvider应用于所有路由的Web中间件组之外,该路由在route / web.php文件中。但是,您也可以通过将其URI添加到VerifyCsrfToken中间件的$ except属性中来排除路由:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'stripe/*',
'http://example.com/foo/bar',
'http://example.com/foo/*',
];
}
答案 20 :(得分:0)
我遇到了同样的问题,我尝试了许多解决方案。但没有一个对我有用。然后我发现由于某种原因,我在.env文件中使用了它:
SESSION_DOMAIN = myapp.me
当我将其重新设置为null时,一切都很好。
答案 21 :(得分:0)
如果您需要使用Javascript更改表单操作,您将遇到同样的问题
1. first ,您需要使用 代替laravel中的{!!Form::open() !!} {!! close() !!}
2. second 您最开始从https://www.example.com +your Route
请勿在您的网址中忘记www !!!
答案 22 :(得分:0)
只需在表单标签内添加@csrf
。
或者您可以在标头中包含csrf_token
,以随每个请求发送。
答案 23 :(得分:0)
如果您已经在表单中添加了 CSRF令牌。然后,可能由于表单中的缓存数据而导致出现错误页面。
打开终端/命令提示符,然后在项目根目录中运行这些命令。
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
,还要尝试清除浏览器缓存以及运行这些命令。
答案 24 :(得分:0)
我的问题已解决,只需在表单标签中添加@csrf
Laravel 5.6
不支持{{ csrf_field() }}
,只需添加@csrf
代替{{ csrf_field() }}
larvel_fix_error.png
答案 25 :(得分:0)
在我的情况下导致同样的问题,因为我忘了在隐藏的输入字段的末尾添加>
,如下所示:<input type="hidden" name="_token" value="{{ Session::token() }}"
所以,我通过添加它来修复它:
<input type="hidden" name="_token" value="{{ Session::token() }}">
答案 26 :(得分:0)
我知道这个问题得到了圆满的回答,但我想提一下在我的案例中有效的修复方法。我添加了{{ csrf_field() }}
,但它仍然没有用。
然后我记得我为了开发目的而阻止了所有的cookie,这在你更改页面并想要刷新它时会很好。
一旦我更改设置以停止阻止MS Edge browser
中的所有Cookie,问题就会消失。
答案 27 :(得分:0)
很有趣,但它对我有用。我意识到这是由于laravel代码中的默认HTML TAG而引起的。 使用/ * * /或{{ - - }}代替
或尝试在您的代码中删除最近的Html Coment ... 或者将Html评论改为Php评论...... 或尝试运行任何Worng工匠命令,如php artisan clean browser并查看是否输出任何HTML评论数据及其错误...
答案 28 :(得分:-1)
您的表单中可能没有 csrf令牌。您必须使用@crsf
或{{ csrf_field() }}
如果在表单上使用csrf。它可能是缓存。清除您的应用缓存。
php artisan cache:clear
php artisan view:clear
php artisan cache:clear
并清除浏览器缓存。
如果再次显示错误,则创建一个新密钥
php artisan key:generate
答案 29 :(得分:-3)
进入
App/Kernel.php
并发表评论
\App\Http\Middleware\VerifyCsrfToken::class
。