it-empower-solutions / security-headers
Génération moderne et configurable de headers HTTP de sécurité pour PHP, Laravel, Symfony et PSR-15.
Package info
github.com/saberjelassi/it-empower-security-headers
pkg:composer/it-empower-solutions/security-headers
Requires
- php: ^8.1
- psr/http-message: ^1.1 || ^2.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
Requires (Dev)
- illuminate/http: ^10.48 || ^11.0 || ^12.0
- illuminate/support: ^10.48 || ^11.0 || ^12.0
- nyholm/psr7: ^1.8
- phpunit/phpunit: ^10.5
- symfony/config: ^5.4 || ^6.4 || ^7.0
- symfony/dependency-injection: ^5.4 || ^6.4 || ^7.0
- symfony/http-kernel: ^5.4 || ^6.4 || ^7.0
Suggests
- illuminate/http: Pour le middleware Laravel.
- illuminate/support: Pour l'auto-discovery, le provider et la facade Laravel.
- symfony/config: Pour configurer le bundle Symfony.
- symfony/dependency-injection: Pour enregistrer les services du bundle Symfony.
- symfony/http-kernel: Pour le bundle et l'event subscriber Symfony.
README
Headers HTTP de sécurité modernes pour PHP 8.1+, avec un cœur indépendant des frameworks et des intégrations PSR-15, Laravel et Symfony.
Le package est maintenu par IT EMPOWER SOLUTIONS. Pour un accompagnement en sécurité applicative ou en développement PHP, contactez contact@it-empower.com.
Fonctionnalités
- builder CSP immuable utilisant une enum de directives validées ;
- nonce par requête généré avec
random_bytes()(256 bits par défaut) ; - CSP appliquée ou
Content-Security-Policy-Report-Only; report-urietreport-to;- HSTS,
nosniff, Referrer-Policy et Permissions-Policy ; - COOP, CORP et COEP ;
- X-Frame-Options optionnel pour les anciens clients ;
- presets
strict,basicetdevelopment; - extensions documentées pour Stripe, Google Tag Manager et Google Fonts ;
- fusion stable sans doublons ;
- suppression par défaut de X-XSS-Protection, HPKP, Expect-CT, Feature-Policy et X-Powered-By.
Installation
composer require it-empower-solutions/security-headers
Prérequis : PHP 8.1 ou supérieur.
Utilisation PHP
use ItEmpower\SecurityHeaders\Csp\Directive; use ItEmpower\SecurityHeaders\Csp\Policy; use ItEmpower\SecurityHeaders\HeaderGenerator; use ItEmpower\SecurityHeaders\SecurityHeadersConfig; $policy = (new Policy()) ->add(Directive::DEFAULT_SRC, ["'self'"]) ->add(Directive::OBJECT_SRC, ["'none'"]) ->addNonce() ->add(Directive::REPORT_URI, ['/csp-report']) ->add(Directive::REPORT_TO, ['csp-endpoint']); $generator = new HeaderGenerator(new SecurityHeadersConfig( csp: $policy, reportOnly: false, hstsPreload: false, )); $nonce = $generator->nonce(); $headerSet = $generator->generate($nonce); foreach ($headerSet->remove as $name) { header_remove($name); } foreach ($headerSet->headers as $name => $value) { header($name.': '.$value); } echo '<script nonce="'.htmlspecialchars($nonce, ENT_QUOTES).'">/* ... */</script>';
Ne réutilisez jamais un nonce entre deux réponses. Le nonce doit être transmis à la vue puis placé uniquement sur les balises de confiance.
Presets
use ItEmpower\SecurityHeaders\HeaderGenerator; use ItEmpower\SecurityHeaders\Presets; $strict = new HeaderGenerator(Presets::strict()); $basic = new HeaderGenerator(Presets::basic()); $development = new HeaderGenerator(Presets::development());
strict utilise des nonces pour les scripts et styles. basic facilite la migration d'une application existante. development est volontairement permissif, active le mode report-only et ne doit pas être déployé en production.
Services tiers
Les extensions ajoutent uniquement les origines nécessaires documentées au moment de la publication. Vérifiez toujours les besoins réels de votre intégration.
use ItEmpower\SecurityHeaders\Csp\PolicyExtensions; $policy = PolicyExtensions::stripe($policy); $policy = PolicyExtensions::googleTagManager($policy); $policy = PolicyExtensions::googleFonts($policy);
Une extension fusionnée plusieurs fois ne crée aucun doublon. Google Tag Manager peut nécessiter des règles supplémentaires selon les tags exécutés ; évitez d'ajouter globalement unsafe-inline.
Middleware PSR-15
use ItEmpower\SecurityHeaders\Middleware\SecurityHeadersMiddleware; use ItEmpower\SecurityHeaders\SecurityHeadersFactory; $generator = SecurityHeadersFactory::fromArray(['preset' => 'strict']); $middleware = new SecurityHeadersMiddleware($generator);
Le nonce est disponible dans la requête PSR-7 :
$nonce = $request->getAttribute(\ItEmpower\SecurityHeaders\HeaderGenerator::NONCE_ATTRIBUTE);
Ajoutez le middleware suffisamment tôt pour que la requête enrichie atteigne le moteur de rendu.
Laravel
Le provider et la facade sont découverts automatiquement.
php artisan vendor:publish --tag=security-headers-config
Ajoutez ensuite le middleware à la pile globale ou à un groupe :
use ItEmpower\SecurityHeaders\Framework\Laravel\SecurityHeadersMiddleware; $middleware->append(SecurityHeadersMiddleware::class); // bootstrap/app.php, Laravel 11+
Dans une vue ou un contrôleur :
$nonce = request()->attributes->get(\ItEmpower\SecurityHeaders\HeaderGenerator::NONCE_ATTRIBUTE);
La configuration publiée permet de sélectionner le preset, le mode report-only, HSTS, les politiques cross-origin, report-uri, report-to et X-Frame-Options.
Symfony
Installez les composants optionnels si votre projet ne les fournit pas déjà :
composer require symfony/config symfony/dependency-injection symfony/http-kernel
Enregistrez le bundle si Symfony Flex ne l'a pas fait :
// config/bundles.php ItEmpower\SecurityHeaders\Framework\Symfony\ItEmpowerSecurityHeadersBundle::class => ['all' => true],
Configuration :
# config/packages/it_empower_security_headers.yaml it_empower_security_headers: preset: strict report_only: false report_uri: /csp-report report_to: csp-endpoint hsts: max_age: 31536000 include_sub_domains: true preload: false
Le subscriber ajoute le nonce à Request::attributes sous la clé it_empower.csp_nonce avant le contrôleur, puis applique les headers sur la réponse principale.
<script nonce="{{ app.request.attributes.get('it_empower.csp_nonce') }}"> // script autorisé </script>
Rapports CSP
report-uri reste utile pour certains navigateurs, tandis que report-to référence un groupe déclaré dans le header Reporting-Endpoints ou Report-To géré par votre application/infrastructure. Le package n'invente pas cet endpoint et ne collecte aucun rapport.
Commencez une migration en report-only, observez les violations, corrigez la politique, puis activez son application. N'envoyez pas les rapports vers une URL non maîtrisée : ils peuvent contenir des chemins applicatifs.
Sécurité et limites
- HSTS doit être envoyé uniquement sur HTTPS. L'inscription à la liste preload exige des critères externes ;
preloadest donc désactivé par défaut. - COEP
require-corppeut bloquer des ressources tierces sans CORS/CORP. Utilisez un preset adapté et testez vos parcours. - X-Frame-Options est désactivé dans le preset strict car
frame-ancestorsest plus précis ; activez-le uniquement pour les anciens clients. - Le package protège contre l'injection CRLF dans les valeurs configurables, mais ne remplace ni TLS, ni la validation des entrées, ni l'échappement HTML.
Tests
composer install vendor/bin/phpunit
Licence
MIT. Voir LICENSE.
Pour découvrir les autres solutions PHP, audits et services numériques, consultez IT EMPOWER SOLUTIONS.