所以我在 Laravel 网站中启用了 CSP,它在本地主机上运行得非常好。但是,当使用域在 Linux 服务器上部署网站时出现问题,它给了我一个错误。
拒绝将表单数据发送到“https://example.com/login”,因为它违反了以下内容安全策略指令:“form-action 'self' https: *.example.com”。
我在自定义 CSP 中添加了一个自定义指令,其链接与登录请求链接完全相同,但它不起作用。我在一些论坛上读到,这可能是由 Google Chrome 阻止任何重定向链接引起的,因为这可能很危险,是的,我使用 Laravel Redirect 旨在将用户登录后重定向到 Homeprovider,但为什么它只影响登录和注销请求?它不会影响除 2 之外的其他表单请求。我想知道这个问题是否有任何解决方案,我在互联网上搜索了许多解决方案,但似乎都不起作用。谢谢你,我真的很感谢你的回答。
这是我在 LoginController 中的登录方法:
public function store(Request $request): RedirectResponse {
$this->ensureIsNotRateLimited();
$request->validate([
'email' => ['required', 'string', 'lowercase', 'email', 'max:255'],
'password' => ['required', 'string'],
]);
if(! Auth::guard('admin')->attempt($request->only('email', 'password'), $request->boolean('remember'))) {
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([
'email' => trans('auth.failed'),
]);
}
$notification = array(
'message' => 'Anda berhasil login!',
'alert-type' => 'success',
);
$request->session()->regenerate();
RateLimiter::clear($this->throttleKey());
return redirect()->intended(RouteServiceProvider::ADMIN_DASHBOARD)->with($notification);
}
这是我从 LoginController 注销的方法:
public function destroy(Request $request): RedirectResponse {
Auth::guard('admin')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/admin/login');
}
我在自定义 CSP 中添加了自定义指令,但它不起作用
->addDirective(Directive::FORM_ACTION, 'https://example.com/login')
->addDirective(Directive::FORM_ACTION, 'https://example.com/logout');
您可以添加一个
Content-Security-Policy-Report-Only
标头,其策略与您的可执行策略相同,但处于仅报告模式。这不会阻止任何内容,但会向指定的报告 URI 报告违规行为。这可以帮助确定到底是什么被阻止以及原因:
header("Content-Security-Policy-Report-Only: default-src 'self'; form-action 'self' https://example.com/login https://example.com/logout; report-uri /your-report-uri");
您允许 *.example.com,其中包含 example.com 的子域。您需要更改为 example.com。或者,如果您想允许将表单发布到 example.com 和所有子域,请使用 example.com 和 *.example.com。