nelmio/security-bundle
Symfony bundle adding practical security headers and protections: Content Security Policy, X-Frame-Options clickjacking defense, HSTS/HTTPS enforcement, signed cookies, external redirect detection, and content-type sniffing disablement.
Installation Add the bundle via Composer:
composer require nelmio/security-bundle
Enable it in config/bundles.php:
Nelmio\SecurityBundle\NelmioSecurityBundle::class => ['all' => true],
Configuration Publish the default config:
php bin/console nelmio:security:install
Review config/packages/nelmio_security.yaml for:
signed_cookies (enable/disable)hsts (HTTP Strict Transport Security)cookie_session_storage (secure session handling)First Use Case
Sign Cookies: Automatically sign sensitive cookies (e.g., remember_me).
# config/packages/nelmio_security.yaml
nelmio_security:
signed_cookies:
enabled: true
keys: ['%kernel.project_dir%/var/security/cookie_keys']
Generate keys:
mkdir -p var/security && openssl rand -hex 32 > var/security/cookie_keys
XSRF-TOKEN, custom auth tokens).
// In a controller
$this->get('nelmio_security.cookie_manager')->setSignedCookie(
'user_prefs',
['theme' => 'dark'],
['lifetime' => 3600]
);
signed_cookies.enabled: true).CookieManager service to set/get signed cookies.nelmio:security:rotate-keys).nelmio_security:
hsts:
enabled: true
max_age: 31536000 # 1 year
include_subdomains: true
FrameworkBundle (no extra middleware needed).curl -v http://your-site.com to verify redirects.symfony/webpack-encore for asset HTTPS in dev.nelmio_security:
cookie_session_storage:
enabled: true
cookie_lifetime: 3600
session.storage.handler_id in framework.yaml:
session:
handler_id: nelmio_security.cookie_session_handler
<form method="POST">
{{ csrf_token('csrf_token') }} {# Renders signed token #}
</form>
csrf_token() in forms. Validate in controllers:
$this->get('nelmio_security.csrf_token_manager')->validateToken(
$request->request->get('_csrf_token')
);
X-Content-Type-Options or X-Frame-Options.
nelmio_security:
headers:
x_frame_options: DENY
x_content_type_options: nosniff
security.headers config.Key Management
nelmio:security:rotate-keys) breaks signed cookies.php bin/console nelmio:security:rotate-keys --dry-run
HSTS Preload
hsts.preload: true requires submitting your site to HSTS Preload List.Cookie Size Limits
session.storage.options to compress data or switch to database storage.CSRF Token Mismatch
$this->get('nelmio_security.csrf_token_manager')->clearTokens();
Enable Verbose Logging:
nelmio_security:
debug: true
Logs appear in var/log/dev.log.
Check Headers:
Use curl -I http://your-site.com to verify:
Strict-Transport-Security (HSTS).X-CSRF-Token (CSRF protection).Custom Cookie Namespaces Override default cookie prefixes:
nelmio_security:
signed_cookies:
namespace: 'app_'
Event Listeners
Extend behavior via events (e.g., nelmio_security.on_cookie_sign):
// src/EventListener/CustomCookieListener.php
public function onCookieSign(CookieSignEvent $event) {
if ($event->getName() === 'user_prefs') {
$event->setData(['custom_field' => 'value']);
}
}
Symfony Flex Overrides
Customize templates (e.g., twig/config.html.twig) to inject security headers:
{% block nelmio_security_headers %}
<meta http-equiv="Content-Security-Policy" content="...">
{% endblock %}
nelmio_security.headers in dev to reduce overhead.How can I help you explore Laravel packages today?