headers->set('X-Content-Type-Options', 'nosniff'); $response->headers->set('X-Frame-Options', 'DENY'); $response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin'); $response->headers->set( 'Permissions-Policy', 'camera=(), geolocation=(), microphone=(), payment=(), usb=()' ); if (app()->isProduction()) { $response->headers->set( 'Content-Security-Policy', "default-src 'self'; base-uri 'self'; connect-src 'self'; font-src 'self' data:; form-action 'self'; frame-ancestors 'none'; img-src 'self' data:; object-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'" ); if ($request->isSecure()) { $response->headers->set( 'Strict-Transport-Security', 'max-age=63072000; includeSubDomains; preload' ); } } if ($this->containsAuthenticationSecrets($request)) { $response->headers->set( 'Cache-Control', 'no-store, no-cache, must-revalidate, private' ); $response->headers->set('Pragma', 'no-cache'); $response->headers->set('Expires', '0'); } return $response; } private function containsAuthenticationSecrets(Request $request): bool { return $request->routeIs([ 'login', 'password.*', 'two-factor.*', 'profile.show', ]); } }