Capítulo 298 de 456
Configurar CSP no Next.js protege contra XSS/clickjacking/injeção; pode ser feito via nonce dinâmico gerado no Proxy (renderização dinâmica obrigatória) ou via header estático em next.config.js quando nonce não é necessário.
script-src/style-src pra liberar scripts inline específicos sem unsafe-inline.Content-Security-Policy e em header custom x-nonce; precisa rodar em toda rota relevante.<Script nonce={...}>.next.config.js via headers(), mais simples mas usa unsafe-inline.connection(): força renderização dinâmica esperando por uma request real, necessário quando se usa nonce.export function proxy(request: NextRequest) {
const nonce = Buffer.from(crypto.randomUUID()).toString('base64')
const isDev = process.env.NODE_ENV === 'development'
const cspHeader = `
default-src 'self';
script-src 'self' 'nonce-${nonce}' 'strict-dynamic'${isDev ? " 'unsafe-eval'" : ''};
style-src 'self' 'nonce-${nonce}';
object-src 'none';
base-uri 'self';
frame-ancestors 'none';
upgrade-insecure-requests;
`
const contentSecurityPolicyHeaderValue = cspHeader.replace(/\s{2,}/g, ' ').trim()
const requestHeaders = new Headers(request.headers)
requestHeaders.set('x-nonce', nonce)
requestHeaders.set('Content-Security-Policy', contentSecurityPolicyHeaderValue)
const response = NextResponse.next({ request: { headers: requestHeaders } })
response.headers.set('Content-Security-Policy', contentSecurityPolicyHeaderValue)
return response
}
export const getServerSideProps: GetServerSideProps = async ({ req }) => {
const nonce = req.headers['x-nonce']
return { props: { nonce } }
}
getServerSideProps no Pages Router.| Modo | Rendering | Cache/CDN | Complexidade |
|---|---|---|---|
| Com nonce | Dinâmico obrigatório | Sem cache CDN por padrão, sem ISR/PPR | Alta |
| Sem nonce | Estático permitido | Cacheável normalmente | Baixa |
| Versão | Mudança |
|---|---|
| v14.0.0 | Suporte experimental a SRI (hash-based CSP) |
| v13.4.20 | Recomendada pra handling correto de nonce/CSP header |
'unsafe-eval' em produção: só necessário em dev (React usa eval pra debug); Next.js/React não usam eval em produção por padrão.matcher ignorando next-router-prefetch e assets.next.config.js é mais simples e mantém cache.nonce manual.'unsafe-eval' é exigência só de dev, nunca deveria ir pra produção.