Skip to content

Security Headers

HeaderPurpose
X-Frame-OptionsPrevent clickjacking
X-Content-Type-OptionsPrevent MIME sniffing
X-XSS-ProtectionXSS filter (legacy)
Strict-Transport-SecurityForce HTTPS
Content-Security-PolicyControl resource loading
server {
# Prevent clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;
# Prevent MIME type sniffing
add_header X-Content-Type-Options "nosniff" always;
# XSS protection (legacy browsers)
add_header X-XSS-Protection "1; mode=block" always;
# Force HTTPS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Referrer policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Permissions policy
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
}
# Basic CSP
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' cdn.jsdelivr.net unpkg.com; style-src 'self' 'unsafe-inline' cdn.jsdelivr.net; img-src 'self' data:; font-src 'self' cdn.jsdelivr.net;" always;
DirectiveControls
default-srcFallback for all
script-srcJavaScript sources
style-srcCSS sources
img-srcImage sources
font-srcFont sources
connect-srcAJAX/WebSocket
frame-ancestorsWho can embed
http:
middlewares:
security-headers:
headers:
customResponseHeaders:
X-Frame-Options: "SAMEORIGIN"
X-Content-Type-Options: "nosniff"
X-XSS-Protection: "1; mode=block"
Strict-Transport-Security: "max-age=31536000"
Terminal window
# Check headers
curl -I https://snapcode.yourdomain.com
# Online tools
# - securityheaders.com
# - observatory.mozilla.org

Since SnapCode uses CDN libraries, CSP needs to allow:

  • cdn.jsdelivr.net (Alpine.js, Tailwind)
  • unpkg.com (alternative CDN)
  • 'unsafe-inline' (inline scripts/styles)