it-empower-solutions/security-headers

Génération moderne et configurable de headers HTTP de sécurité pour PHP, Laravel, Symfony et PSR-15.

Maintainers

Package info

github.com/saberjelassi/it-empower-security-headers

Homepage

pkg:composer/it-empower-solutions/security-headers

Transparency log

Statistics

Installs: 1

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-09-02 08:35 UTC

This package is auto-updated.

Last update: 2026-09-02 08:41:11 UTC


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-uri et report-to ;
  • HSTS, nosniff, Referrer-Policy et Permissions-Policy ;
  • COOP, CORP et COEP ;
  • X-Frame-Options optionnel pour les anciens clients ;
  • presets strict, basic et development ;
  • 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 ; preload est donc désactivé par défaut.
  • COEP require-corp peut 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-ancestors est 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.