【发布时间】:2019-03-16 19:16:57
【问题描述】:
我在同一台服务器上托管了多个 Laravel 站点。在我创建的最新站点中,联系表单拒绝提交而不会引发 419 错误。我已经在我的 web.php 文件中设置了路由,就像其他网站一样,这些网站具有实时、有效的联系表单,并且我生成和发送令牌的方式完全相同 - 使用 {{ csrf_field() }}。
我找到了一个类似问题的答案,指出您可以通过将条目添加到 app/Http/Middleware/VerifyCsrfToken.php 中的 $except 数组来禁用 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 框架 5.7.3
非工作版本:Laravel Framework 5.7.9
也许这是 Laravel 的一个错误?或者我服务器上的某些包已经过时,需要更新才能与新版本的 Laravel 一起使用?
【问题讨论】:
-
假设 CSRF 验证我猜你已经在 web.php 而不是在 api.php 中设置了这些路由?
-
是的,在
web.php我有以下两条路线:Route::get('/contact', 'ContactController@index');和Route::post('/contact', 'ContactController@contactSubmit'); -
您是否看到
_token值被发送到 POST 路由?dd($request->all())在contactSubmit函数中,并确保它被正确发送。 -
我在发布这个问题之前添加了
dd($request->all()),并且在我的本地开发环境中它正确显示了json输出,包括_token。但是,在服务器上,它甚至不会到达dd(),因为它在执行contactSubmit()方法中的第一行代码之前就抛出了419 错误。但是我服务器上托管的其他网站上的其他联系表格可以正常工作,没有任何问题。 -
@Chad 您是否看到
_token在浏览器的网络检查器的“网络”选项卡中随请求一起发送?
标签: php laravel csrf-protection laravel-middleware