Security Middleware
Nexios provides a comprehensive security middleware that implements various security headers and protections. This guide covers all available security options and best practices.
Quick Start
python
from nexios import NexiosApp
from nexios.middleware.security import SecurityMiddleware
app = NexiosApp()
# Basic usage with defaults
app.add_middleware(SecurityMiddleware())
# Advanced configuration
app.add_middleware(
SecurityMiddleware(
csp_enabled=True,
hsts_enabled=True,
ssl_redirect=True,
frame_options="DENY"
)
)
Security Features
1. Content Security Policy (CSP)
CSP
Content Security Policy is a powerful security feature that helps prevent XSS attacks by controlling which resources can be loaded.
python
security = SecurityMiddleware(
csp_enabled=True,
csp_policy={
'default-src': ["'self'"],
'script-src': ["'self'", "'unsafe-inline'"],
'style-src': ["'self'", 'https://fonts.googleapis.com'],
'img-src': ["'self'", 'data:', 'https:'],
'font-src': ["'self'", 'https://fonts.gstatic.com'],
'connect-src': ["'self'", 'https://api.example.com']
},
csp_report_only=False # Set to True for testing
)
2. Cross-Origin Resource Sharing (CORS)
CORS Configuration
Carefully configure CORS settings to balance security and functionality.
python
security = SecurityMiddleware(
cors_enabled=True,
allowed_origins=["https://example.com"],
allowed_methods=["GET", "POST"],
allowed_headers=["Content-Type", "Authorization"],
expose_headers=["X-Custom-Header"],
max_age=3600,
allow_credentials=True
)
3. HTTP Strict Transport Security (HSTS)
python
security = SecurityMiddleware(
hsts_enabled=True,
hsts_max_age=31536000, # 1 year
hsts_include_subdomains=True,
hsts_preload=True
)
4. XSS Protection
python
security = SecurityMiddleware(
xss_protection=True,
xss_mode="block" # or "filter"
)
5. Frame Options
python
security = SecurityMiddleware(
frame_options="DENY", # or "SAMEORIGIN"
# Or allow specific origin:
frame_options_allow_from="https://trusted.com"
)
6. SSL/HTTPS Redirect
python
security = SecurityMiddleware(
ssl_redirect=True,
ssl_host="secure.example.com",
ssl_permanent=True # 301 redirect
)
7. Cross-Origin Policies
python
security = SecurityMiddleware(
cross_origin_opener_policy="same-origin",
cross_origin_embedder_policy="require-corp",
cross_origin_resource_policy="same-origin"
)
8. Permissions Policy
python
security = SecurityMiddleware(
permissions_policy={
'camera': "'none'",
'microphone': "'self'",
'geolocation': ["'self'", "https://maps.example.com"],
'payment': "'self'"
}
)
9. Cache Control
python
security = SecurityMiddleware(
cache_control="no-store, no-cache, must-revalidate, proxy-revalidate",
clear_site_data=["cache", "cookies", "storage"]
)
10. Expect-CT
python
security = SecurityMiddleware(
expect_ct=True,
expect_ct_max_age=86400,
expect_ct_enforce=True,
expect_ct_report_uri="https://example.com/report"
)
Complete Configuration Example
Full Configuration
python
from nexios import NexiosApp
from nexios.middleware import SecurityMiddleware
app = NexiosApp()
security = SecurityMiddleware(
# Content Security Policy
csp_enabled=True,
csp_policy={
'default-src': ["'self'"],
'script-src': ["'self'", "'unsafe-inline'"],
'style-src': ["'self'", 'https://fonts.googleapis.com'],
'img-src': ["'self'", 'data:', 'https:'],
'connect-src': ["'self'", 'https://api.example.com']
},
csp_report_only=False,
# CORS
cors_enabled=True,
allowed_origins=["https://example.com"],
allowed_methods=["GET", "POST", "PUT", "DELETE"],
allowed_headers=["*"],
expose_headers=["X-Custom-Header"],
max_age=3600,
allow_credentials=True,
# HSTS
hsts_enabled=True,
hsts_max_age=31536000,
hsts_include_subdomains=True,
hsts_preload=True,
# XSS Protection
xss_protection=True,
xss_mode="block",
# Frame Options
frame_options="DENY",
# Content Type Options
content_type_options=True,
# Referrer Policy
referrer_policy="strict-origin-when-cross-origin",
# SSL/HTTPS
ssl_redirect=True,
ssl_host="secure.example.com",
ssl_permanent=True,
# Cache Control
cache_control="no-store, no-cache",
clear_site_data=["cache", "cookies"],
# Cross-Origin Policies
cross_origin_opener_policy="same-origin",
cross_origin_embedder_policy="require-corp",
cross_origin_resource_policy="same-origin",
# Expect-CT
expect_ct=True,
expect_ct_max_age=86400,
expect_ct_enforce=True,
# Trusted Types
trusted_types=True,
trusted_types_policies=["default", "escape"],
# Server
hide_server=True
)
app.add_middleware(security)
Best Practices
Production Settings
Production Security
For production environments, we recommend:
- Enable HTTPS redirect
- Enable HSTS
- Set strict CSP rules
- Enable all security headers
- Configure proper CORS settings
python
security = SecurityMiddleware(
# Force HTTPS
ssl_redirect=True,
ssl_permanent=True,
# Strict CSP
csp_enabled=True,
csp_policy={
'default-src': ["'self'"],
'script-src': ["'self'"],
'object-src': ["'none'"],
'base-uri': ["'self'"],
'frame-ancestors': ["'none'"]
},
# HSTS
hsts_enabled=True,
hsts_max_age=31536000,
hsts_include_subdomains=True,
# Other Security Headers
frame_options="DENY",
content_type_options=True,
referrer_policy="strict-origin-when-cross-origin",
# Hide Server Info
hide_server=True
)
Development Settings
Development Mode
For development, you might want to relax some settings:
python
security = SecurityMiddleware(
# Disable HTTPS redirect
ssl_redirect=False,
# Relaxed CSP for development tools
csp_policy={
'default-src': ["'self'"],
'script-src': ["'self'", "'unsafe-inline'", "'unsafe-eval'"],
'style-src': ["'self'", "'unsafe-inline'"],
'connect-src': ["'self'", "ws://localhost:*"]
},
# Allow all origins in development
cors_enabled=True,
allowed_origins=["*"],
# Disable HSTS in development
hsts_enabled=False
)
Header Reference
Header | Purpose | Default |
---|---|---|
Content-Security-Policy | Control resource loading | self only |
X-Frame-Options | Prevent clickjacking | DENY |
X-XSS-Protection | XSS filter | 1; mode=block |
Strict-Transport-Security | Force HTTPS | max-age=31536000 |
X-Content-Type-Options | Prevent MIME sniffing | nosniff |
Referrer-Policy | Control referrer info | strict-origin-when-cross-origin |
Permissions-Policy | Control browser features | Various restrictions |
Clear-Site-Data | Clear browser data | None |
Cross-Origin-*-Policy | Cross-origin isolation | same-origin |
Common Scenarios
API Server
python
security = SecurityMiddleware(
cors_enabled=True,
allowed_origins=["https://api.example.com"],
allowed_methods=["GET", "POST", "PUT", "DELETE"],
allowed_headers=["Authorization", "Content-Type"],
expose_headers=["X-Request-ID"],
allow_credentials=True
)
Static Website
python
security = SecurityMiddleware(
csp_policy={
'default-src': ["'self'"],
'img-src': ["'self'", "data:", "https:"],
'style-src': ["'self'", "https://fonts.googleapis.com"],
'font-src': ["'self'", "https://fonts.gstatic.com"]
},
frame_options="DENY",
cache_control="public, max-age=31536000"
)
WebSocket Server
python
security = SecurityMiddleware(
cors_enabled=True,
allowed_origins=["https://example.com"],
csp_policy={
'default-src': ["'self'"],
'connect-src': ["'self'", "wss://ws.example.com"]
}
)
Troubleshooting
Common Issues
- CSP Blocking Resources: Check browser console for CSP violations
- CORS Issues: Verify allowed origins and methods
- HSTS Problems: Cannot be easily undone, use carefully
- Mixed Content: Ensure all resources use HTTPS