Laravel 419错误 - VerifyCsrfToken问题

问题描述 投票:1回答:3

我在同一台服务器上托管了多个Laravel站点。使用我创建的最新网站,联系表单拒绝提交而不会丢失419错误。我已经在我的web.php文件中设置了路由,就像其他网站一样,这些网站都有实时,工作的联系表单,而且我使用{{ csrf_field() }}以完全相同的方式生成和发送令牌。

我找到了一个类似问题的答案,说明你可以通过向$except中的app/Http/Middleware/VerifyCsrfToken.php数组添加条目来禁用Csrf检查。我已经确认这确实解决了419错误:

protected $except = [
    'contact',
    'contact*',
];

但是我当然希望保留Csrf功能,而我只更新了$except数组以获得故障排除值。

有没有人知道新的Laravel环境可能有什么不同,尽管传递了生成的令牌,但这有419的行为?我已经尝试更新了许多ENV设置并切换了不同的东西,但除了修改$except数组之外,对此问题没有任何影响。

更新

由于到目前为止已经进行了一些讨论,我想我会提供一些额外的信息和代码。

首先,这是一个ajax形式,但不要跳出你的座位。我一直在测试有和没有ajax的表单。如果我想用ajax测试,我只需单击连接到jQuery监听器的按钮。如果没有,我更改或删除按钮的ID,或在控制台窗口中运行$("#formName").submit();

上面的(ajax,老式提交和带有.submit();的jquery选择器)都会产生完全相同的响应 - 一个419错误。

为了完整起见,这是我的ajax代码,它正在我正在托管的所有其他网站上工作。我定义了一个postData数组来保持它整洁,我在它之后直接添加了一个console.log()语句(再次)确认令牌生成正常并且正在与请求正确传递。

var postData = {

    name: $("#name").val(),
    email: $("#email").val(),
    message: $("#message").val(),

    _token: $("input[name=_token]").val()

};

console.log(postData);


$.post("/contact", postData, function (data) {

...

有任何想法吗?我的ENV或其他文件可能存在配置问题吗?

进度更新!

因为其他网站工作正常,我克隆了一个旧网站,只是覆盖了我为新网站更改的文件,并且bam!它现在正在运作。再做一点挖掘,我在网站的克隆版本上运行php artisan --version而不是非工作版本,结果如​​下:

工作版本:Laravel Framework 5.7.3

非工作版本:Laravel Framework 5.7.9

也许这是Laravel的一个错误?或者我的服务器上的某些软件包可能已过期,需要更新才能使用新版本的Laravel?

php laravel csrf-protection laravel-middleware
3个回答
1
投票

刚刚在框架回购中发现了你的问题。这不是一个laravel问题,您的安装缺少对存储文件夹的写权限,因此laravel无法写入会话,日志等。

您收到419错误,因为您无法写入文件,因此您无法创建会话,因此您无法验证csrf令牌。

快速修复:chmod -R 777 storage

正确修复:将您的安装移动到nginx / apache /您的用户实际可以写入的文件夹。如果您正在使用nginx / apache,请移动您的app并在项目上给予正确的权限(chown -R www-data: /path-to-project)如果您使用的是php artisan serve,请将其权限更改为您的用户:chown -R $(whoami) /path-to-project

你得到它,让作家写,你很好。


0
投票

看看我对这个问题的答案,如果它对你想要实现的Form post request return error 419 unknown status laravel有所帮助


-3
投票

测试此代码

Route::get('/contact', [
   'uses' => 'ContactController@index',
   'nocsrf' => true,
]);
Route::post('/contact', [
   'uses' => 'ContactController@contactSubmit',
   'nocsrf' => true,
]);

或者你可以删除孔csrf

protected $except = [
    '*'
];
© www.soinside.com 2019 - 2024. All rights reserved.