1. Overview
Next.js provides a rich set of features such as API routes, middleware, image optimization, server actions, and edge functions. While these features improve developer productivity, they also expand the attack surface of applications if misconfigured or left unpatched.
This document outlines:
- Common vulnerability classes affecting Next.js applications
- Typical root causes
- How to assess impact in an existing codebase
- Recommended mitigations and operational practices
- A baseline security checklist for production deployments
This is framework-agnostic in principle, but examples are tailored to Next.js (13/14+ with App Router and older Pages Router where relevant).
2. Threat Model
2.1 Assets at Risk
- User data (PII, auth tokens, session cookies)
- Internal APIs and admin endpoints
- Infrastructure credentials (env vars, API keys)
- Backend services reachable via SSR / proxy features
- Application availability (DoS vectors)
2.2 Typical Attackers
- Opportunistic attackers scanning for known CVEs
- Automated bots exploiting misconfigurations
- Targeted attackers abusing business logic flaws
- Supply chain attackers via compromised dependencies
3. Common Vulnerability Classes in Next.js Apps
3.1 Server-Side Request Forgery (SSRF)
Where it appears:
next/imageremote loaders- Custom proxy endpoints in API routes
- Server actions or route handlers that fetch URLs from user input
Example anti-pattern:
// app/api/proxy/route.ts
export async function GET(req: Request) {
const { searchParams } = new URL(req.url);
const url = searchParams.get("url"); // user-controlled
const res = await fetch(url!);
return new Response(await res.text());
}
Risk:
- Access to internal services (e.g., metadata endpoints, private APIs)
- Data exfiltration
- Lateral movement inside infrastructure
Mitigation:
- Strict allowlist of domains
- URL parsing + protocol validation
- Network-level egress restrictions
3.2 Authentication & Authorization Bypass
Where it appears:
- API routes missing auth checks
- Middleware that only runs on some paths
- Server actions assumed to be “internal”
- Client-side only auth checks
Example anti-pattern:
// app/api/admin/users/route.ts
export async function GET() {
// No auth check
return Response.json(await getAllUsers());
}
Mitigation:
- Enforce auth at the server boundary (route handlers, server actions)
- Centralize auth logic (middleware or shared guard)
- Deny-by-default for sensitive routes
3.3 Open Redirects
Where it appears:
- Login flows using
redirectquery params - OAuth callbacks
- Custom middleware redirects
Example anti-pattern:
const redirect = searchParams.get("redirect");
return NextResponse.redirect(redirect || "/");
Risk:
- Phishing
- Token leakage in redirect chains
Mitigation:
- Only allow relative paths
- Validate against an allowlist
- Strip protocol and host components
3.4 Information Disclosure via Environment Variables
Where it appears:
- Misuse of
NEXT_PUBLIC_* - Accidental serialization of server config to client
- Logging sensitive env vars
Mitigation:
- Audit all
NEXT_PUBLIC_*variables - Never expose secrets to client bundle
- Use runtime secrets only on the server
3.5 Dependency & Supply Chain Vulnerabilities
Where it appears:
- Outdated Next.js versions
- Vulnerable transitive dependencies
- Unpinned or loosely pinned versions
Mitigation:
- Regularly update Next.js
- Use
npm audit,pnpm audit, oryarn audit - Enable Dependabot / Renovate
- Monitor CVE advisories
4. Impact Assessment Checklist
For an existing Next.js codebase, review:
- All API routes and route handlers have auth where required
- Middleware does not trust user input for redirects or rewrites
- No proxy endpoints fetch arbitrary user-provided URLs
next/imageremote patterns are restricted- No sensitive env vars are exposed to the client
- Next.js version is within a supported and patched range
- Dependencies have no known critical vulnerabilities
- Error messages do not leak stack traces or secrets in production
5. Secure Configuration Recommendations
5.1 next.config.js / next.config.mjs
- Restrict
images.remotePatterns - Avoid overly broad rewrites/proxies
- Disable experimental features not in use
- Review headers and CSP configuration
Example:
images: {
remotePatterns: [
{
protocol: "https",
hostname: "cdn.example.com",
},
],
},
5.2 Middleware & Route Handlers
- Validate all inputs
- Centralize auth checks
- Avoid passing raw user input into redirects, fetch, or file paths
6. Operational Practices
- Patch cadence: Update Next.js and dependencies at least monthly
- CI security checks: Run audits on every PR
- Monitoring: Log and alert on unusual API usage patterns
- Incident response: Have a process to rotate secrets and invalidate sessions
7. Recommended Tooling
npm audit/pnpm audit- Dependabot / Renovate
- Snyk or similar SCA tools
- Static analysis (ESLint security rules)
- Runtime WAF / edge protection (Cloudflare, etc.)
8. Conclusion
Next.js provides strong primitives, but security depends on usage, configuration, and maintenance. Most real-world issues arise from:
- Missing server-side authorization
- Overly permissive proxying or redirects
- Outdated dependencies
- Assumptions about “safe defaults”
A secure Next.js application requires:
- Regular updates
- Input validation at all server boundaries
- Explicit trust models
- Continuous dependency and configuration review
9. Appendix: Minimal Secure Baseline
- Keep Next.js updated
- Enforce auth on all sensitive server routes
- Restrict outbound fetch targets
- Validate redirects
- Audit env var exposure
- Automate dependency checks