1- // lib/security-headers.ts
1+ // lib/security/security -headers.ts - Updated version
22import { NextRequest , NextResponse } from 'next/server' ;
33import React from 'react' ;
44
@@ -18,23 +18,27 @@ export function applySecurityHeaders(
1818 // Generate CSP nonce if not provided
1919 const cspNonce = nonce || generateNonce ( ) ;
2020
21- // Content Security Policy - Strict
21+ // Content Security Policy - More lenient for development
22+ const isDevelopment = process . env . NODE_ENV === 'development' ;
23+
2224 const csp = [
2325 "default-src 'self'" ,
24- `script-src 'self' 'nonce-${ cspNonce } ' https://cdnjs.cloudflare.com https://va.vercel-scripts.com` ,
25- "style-src 'self' 'unsafe-inline'" , // Unfortunately needed for Tailwind
26+ isDevelopment
27+ ? `script-src 'self' 'unsafe-inline' 'unsafe-eval' 'nonce-${ cspNonce } ' https://cdnjs.cloudflare.com https://va.vercel-scripts.com https://vercel.live`
28+ : `script-src 'self' 'nonce-${ cspNonce } ' https://cdnjs.cloudflare.com https://va.vercel-scripts.com` ,
29+ "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com" ,
2630 "img-src 'self' data: https: blob:" ,
27- "font-src 'self' data:" ,
28- "connect-src 'self' https://api.github.com https://*.supabase.co wss://*.supabase.co https://vitals.vercel-insights.com" ,
31+ "font-src 'self' data: https://fonts.gstatic.com " ,
32+ "connect-src 'self' https://api.github.com https://*.supabase.co wss://*.supabase.co https://vitals.vercel-insights.com https://vercel.live " ,
2933 "frame-src 'none'" ,
3034 "object-src 'none'" ,
3135 "base-uri 'self'" ,
3236 "form-action 'self'" ,
3337 "frame-ancestors 'none'" ,
34- "upgrade-insecure-requests" ,
38+ isDevelopment ? "" : "upgrade-insecure-requests" ,
3539 "block-all-mixed-content" ,
3640 "manifest-src 'self'"
37- ] . join ( '; ' ) ;
41+ ] . filter ( Boolean ) . join ( '; ' ) ;
3842
3943 response . headers . set ( 'Content-Security-Policy' , csp ) ;
4044
@@ -47,8 +51,8 @@ export function applySecurityHeaders(
4751 response . headers . set ( 'X-Download-Options' , 'noopen' ) ;
4852 response . headers . set ( 'X-Permitted-Cross-Domain-Policies' , 'none' ) ;
4953
50- // Strict Transport Security (HSTS)
51- if ( process . env . NODE_ENV === 'production' ) {
54+ // Strict Transport Security (HSTS) - only in production
55+ if ( ! isDevelopment ) {
5256 response . headers . set (
5357 'Strict-Transport-Security' ,
5458 'max-age=31536000; includeSubDomains; preload'
@@ -102,7 +106,7 @@ export function getSecurityHeadersForRoute(pathname: string): Record<string, str
102106 return baseHeaders ;
103107}
104108
105- // React component to inject CSP nonce
109+ // React component to inject CSP nonce - Updated
106110export function SecurityHeaders ( { nonce } : { nonce : string } ) : React . ReactElement {
107111 return React . createElement ( 'script' , {
108112 nonce : nonce ,
0 commit comments