Laravel 419 错误 -VerifyCsrfToken 问题

Cha*_*had 6 php csrf-protection laravel laravel-middleware

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

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

protected $except = [
    'contact',
    'contact*',
];
Run Code Online (Sandbox Code Playgroud)

但我当然希望保留 Csrf 功能,并且我仅更新了$except用于故障排除值的数组。

有谁知道新的 Laravel 环境可能有什么不同,尽管传递了生成的令牌,但仍会出现 419 行为?我尝试过更新一些 ENV 设置并切换不同的东西,但除了修改$except数组之外,没有任何其他方法对这个问题产生任何影响。

更新

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

首先,这是一个 ajax 形式,但先不要从座位上跳起来。我一直在使用和不使用ajax 的情况下测试表单。如果我想使用 ajax 进行测试,我只需单击连接到 jQuery 侦听器的按钮即可。如果没有,我会更改或删除按钮的 ID,或者$("#formName").submit();在控制台窗口中运行。

上述(ajax、老式提交和带有 的 jquery 选择器.submit();)都会产生完全相同的响应 - 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) {

...
Run Code Online (Sandbox Code Playgroud)

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

进度更新!

因为其他网站工作得很好,所以我克隆了一个旧网站,并简单地覆盖了我为新网站更改的文件,然后砰!现在正在工作。经过进一步挖掘,我php artisan --version在网站的克隆版本与非工作版本上运行,结果如下:

工作版本:Laravel 框架 5.7.3

非工作版本:Laravel Framework 5.7.9

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

Mag*_*gus 1

刚刚在框架存储库上发现了您的问题。这不是 Laravel 的问题,您的安装缺少存储文件夹的写入权限,因此 Laravel 无法写入会话、日志等。

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

快速解决:chmod -R 777 storage

正确的修复方法:将您的安装移动到 nginx/apache/您的用户实际可以写入的文件夹。如果您使用的是 nginx/apache,请将您的应用程序移至那里并授予项目正确的权限(chown -R www-data: /path-to-project) 如果您使用的是 php artisanserve,请将其权限更改为您的用户:chown -R $(whoami) /path-to-project

你明白了,让作家写,你就很好了。

  • 我正在使用数据库驱动程序,但仍然存在此问题。 (2认同)