headers->set('X-Frame-Options', 'SAMEORIGIN'); // Empêche le navigateur de "deviner" le type MIME d'un fichier $response->headers->set('X-Content-Type-Options', 'nosniff'); // Limite les informations de référent envoyées vers l'extérieur $response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin'); // Désactive des API navigateur sensibles non utilisées par l'app $response->headers->set( 'Permissions-Policy', 'geolocation=(), microphone=(), camera=(), payment=()' ); // HSTS : force le navigateur à n'utiliser que HTTPS pendant 1 an. // Uniquement sur connexion sécurisée (le reverse proxy NPM termine le TLS). if ($request->isSecure()) { $response->headers->set( 'Strict-Transport-Security', 'max-age=31536000; includeSubDomains' ); } // Content-Security-Policy : restreint les sources de contenu autorisées. // 'unsafe-inline' est toléré pour les styles/scripts Blade + Filament. $response->headers->set( 'Content-Security-Policy', "default-src 'self'; " ."img-src 'self' data: https:; " ."script-src 'self' 'unsafe-inline' 'unsafe-eval'; " ."style-src 'self' 'unsafe-inline' https:; " ."font-src 'self' data: https:; " ."connect-src 'self'; " ."frame-ancestors 'self'" ); return $response; } }