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