03Network
Security Headers
Security Headers — Instruction 03
Coverage
OWASP A05:2021, CWE-693, CWE-1021
Required Headers
1. HSTS
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
2. Content Security Policy (CSP) + Nonces
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{RANDOM}'; style-src 'self' 'nonce-{RANDOM}'; img-src 'self' data: https:; frame-ancestors 'none'; base-uri 'self'; form-action 'self';
Nonce per request:
const nonce = crypto.randomBytes(16).toString('base64')
🔴 Never use 'unsafe-inline' or 'unsafe-eval'
3. X-Frame-Options
X-Frame-Options: DENY
4. X-Content-Type-Options
X-Content-Type-Options: nosniff
5. Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
6. Permissions-Policy
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=()
7. COOP / COEP / CORP (Spectre mitigation)
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Resource-Policy: same-origin
8. Remove Fingerprinting Headers
app.disable('x-powered-by') // Express
// Nginx: server_tokens off;
Remove: X-Powered-By, Server version, X-AspNet-Version
9. Trusted Types (DOM XSS)
Add to CSP: require-trusted-types-for 'script'
Scan for: innerHTML =, document.write(), outerHTML =
10. Private Network Access
Access-Control-Allow-Private-Network: true
11. Sec-Fetch Validation
app.use((req, res, next) => {
if (req.method !== 'GET' && req.headers['sec-fetch-site'] === 'cross-site') {
return res.status(403).json({ error: 'Cross-site request blocked' })
}
next()
})
12. SRI for CDN Resources
<script src="https://cdn.example.com/lib.js"
integrity="sha384-[hash]" crossorigin="anonymous"></script>
🔴 Flag any CDN resource without integrity hash
13. Clear-Site-Data on Logout
res.setHeader('Clear-Site-Data', '"cache", "cookies", "storage"')
14. Cache-Control per Page Type
Sensitive pages: Cache-Control: no-store, no-cache, private
API user data: Cache-Control: private, no-store
Static assets: Cache-Control: public, max-age=31536000, immutable
Public pages: Cache-Control: public, s-maxage=300
Stack Templates
- Next.js →
templates/security-headers/next.config.js - Express →
templates/security-headers/express-helmet.js - Vercel →
templates/security-headers/vercel.json - Nginx →
templates/security-headers/nginx.conf - Cloudflare →
templates/security-headers/_headers