Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 419错误-验证CSRFToken问题_Php_Laravel_Csrf Protection_Laravel Middleware - Fatal编程技术网

Php Laravel 419错误-验证CSRFToken问题

Php Laravel 419错误-验证CSRFToken问题,php,laravel,csrf-protection,laravel-middleware,Php,Laravel,Csrf Protection,Laravel Middleware,我有多个Laravel站点托管在同一台服务器上。在我创建的最新网站上,联系人表单拒绝提交,但没有抛出419错误。我已经在我的web.php文件中设置了路由,就像其他网站一样,这些网站都有实时、工作的联系人表单,我生成和发送令牌的方式完全相同-使用{{csrf_field()} 我找到了一个类似问题的答案,说明可以通过向app/Http/Middleware/VerifyCsrfToken.php中的$except数组添加条目来禁用Csrf检查。我已经证实,这确实解决了419错误: protect

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

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

protected $except = [
    'contact',
    'contact*',
];
但我当然希望保留Csrf功能,我只更新了
$,除了
数组中的疑难解答值

有人知道新的Laravel环境会有什么不同吗?尽管传递了生成的令牌,但它会有419行为?我尝试过更新许多环境设置和切换不同的东西,但除了修改
$except
数组之外,没有其他任何东西对这个问题产生任何影响

更新 由于到目前为止有一些讨论,我想我应该提供一些额外的信息和代码

首先,这是一个ajax表单,但是现在还不要跳出座位。我一直在测试使用和不使用ajax的表单。如果我想使用ajax进行测试,我只需单击连接到jQuery侦听器的按钮。如果没有,我会更改或删除按钮的ID,或者运行
$(“#formName”).submit()

上述操作(ajax、老式的submit和带有
.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或其他文件是否存在配置问题

进度更新! 因为其他网站运行得很好,所以我克隆了一个旧网站,并简单地重写了我为新网站更改的文件,砰!它正在工作。做了一点进一步的挖掘,我在站点的克隆版本和非工作版本上运行了php artisan--version
,结果如下:

工作版本:Laravel Framework 5.7.3

非工作版本:Laravel Framework 5.7.9


也许这是拉威尔的一只虫子?或者,我的服务器上的某些软件包已经过时,需要更新才能与新版本的Laravel一起使用?

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

由于无法写入文件,因此无法创建会话n,因此无法验证csrf令牌,因此会出现419错误

快速修复:
chmod-R 777存储

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


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

看看我对这个问题的回答,如果它对你想要实现的目标有帮助的话。

运行这个命令
php artisan密钥:生成

浏览器地址栏中的域可能与env文件中的
密钥
配置/session.php
配置文件或
会话\域
不匹配

TLDR:这篇文章包含很多潜在的问题和修复;它是为那些搜索相关奖金信息时卡住

我刚刚在使用Laravel Sanctum时遇到了这个错误,看起来中间件的设置不正确。Sanctum使用
auth:Sanctum
中间件作为保护,这是Laravel默认使用的
auth
保护的某种扩展,但会话由
web
中间件组处理

我无法准确地表达一些拉威尔内部的东西;目前我对JavaScript的经验比PHP丰富

在我的
api.php
文件中,我有登录/注册/注销路径,在我的
Kernel.php
文件中,我将
\illustration\Session\Middleware\StartSession::class,
从web组复制到api组中

我必须这样做来修复我的登录单元测试,该测试抛出了一个关于“会话存储未按请求进行”的错误。通过复制,我可以在单元测试中使用我的
postJson
请求,但不久之后,我开始从JavaScript应用程序中看到419个CSRF错误帖子(这是不好的,因为它在之前工作得很好)

我开始在
/storage/framework/sessions
文件夹中寻找一些文件系统权限转移,但问题不是(对我来说)

我后来发现,对于Laravel Sanctum和默认的
AuthenticatesUsers
trait,您必须使用
web
guard for auth,以及
auth:Sanctum
中间件来保护路由。我试图使用
api
guard进行身份验证路由,这是AuthenticatesUsers特性出现419个错误的核心

如果有人在CSRF工作或应该工作时得到419,我建议您在系统中需要这些工作的所有关键点进行一些
\Log::debug()
调查:

Auth::check()

Auth::user()

Auth::logout()
根据我的观察,如果您对这些会话有奇怪的行为,那么您的配置与
会话相关,或者与
import Cookies from 'js-cookie';

axios.interceptors.request.use(async (request) => {
    try {
        const csrf = Cookies.get('XSRF-TOKEN');
        request.withCredentials = true;

        if (csrf) {
            request.headers.common['XSRF-TOKEN'] = csrf;
        }

        return request;
    } catch (err) {
        throw new Error(`axios# Problem with request during pre-flight phase: ${err}.`);
    }
});
<meta name="csrf-token" content="{{ csrf_token() }}">
window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

const token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}