Skip to main content
All blogs
Next.js Security: Recent Vulnerabilities and How to Prevent Them
Next.jsSecurityWeb DevelopmentDevOps

Next.js Security: Recent Vulnerabilities and How to Prevent Them

A deep dive into recent Next.js security issues like SSRF in Server Actions and RSC vulnerabilities, with practical steps to secure your app.

April 23, 20268 min readby Zuhaib Rashid

The Shift in Next.js Security

As Next.js evolves from a simple SSR framework to a full-stack powerhouse with Server Components and Server Actions, the attack surface has shifted. Recent vulnerabilities have highlighted that with great power comes great responsibility — especially when it comes to how we handle server-side logic and data flow.

Next.js Security

1. CVE-2024-34351: SSRF in Server Actions

One of the most talked-about vulnerabilities recently was a Server-Side Request Forgery (SSRF) flaw in Next.js Server Actions. If you were using a version earlier than 14.1.1 and self-hosting your app, an attacker could potentially make unauthorized requests from your server.

The Trigger: This happened when a Server Action performed a redirect to a relative path starting with a forward slash (/). Attackers could manipulate the Host header to trick the server into requesting internal metadata services (like AWS's 169.254.169.254).

How to Prevent It:

  • Upgrade: The absolute first step is upgrading to Next.js 14.1.1 or higher.
  • Host Header Validation: If you are self-hosting on a custom server (like Express or Nginx), ensure you are validating the Host header.
  • Network Isolation: Block outbound requests to internal IP ranges from your application server.

2. React2Shell (CVE-2025-66478)

Late in 2025, a critical vulnerability dubbed "React2Shell" sent shockwaves through the community. It targeted the React Server Components (RSC) protocol, potentially allowing Remote Code Execution (RCE) in certain configurations.

This vulnerability exploited the way the RSC payload was parsed on the server, allowing malicious payloads to be executed with the privileges of the application process.

How to Prevent It:

  • Stay Updated: This is a recurring theme. Security patches for RSC and Next.js are released frequently.
  • Rotate Secrets: If you suspect your app was vulnerable during the peak of this incident, rotate all environment variables and API keys immediately.

3. Server Actions & Data Exposure

Beyond specific CVEs, a common issue is the improper use of Server Actions. Since Server Actions are essentially POST endpoints, they are public by default. Developers often forget to implement proper authorization checks inside the action itself.

tsx
// ❌ VULNERABLE: No authorization check
export async function deletePost(postId: string) {
  await db.post.delete({ where: { id: postId } });
}

// ✅ SECURE: Authorization check included
export async function deletePost(postId: string) {
  const session = await auth();
  if (!session || session.user.role !== 'admin') {
    throw new Error("Unauthorized");
  }
  await db.post.delete({ where: { id: postId } });
}

General Security Best Practices

To keep your Next.js application secure in 2026, follow these core principles:

  • Use Taint APIs: React now provides experimental_taintUniqueValue and experimental_taintObjectReference to prevent sensitive data from being accidentally passed to the client.
  • Validate All Input: Use libraries like Zod to validate every piece of data coming into a Server Action or Route Handler.
  • Content Security Policy (CSP): Implement a strict CSP to mitigate XSS and data injection attacks. Next.js makes this easier with nonces.
  • Principle of Least Privilege: Your database user should only have the permissions necessary for the app to function. Don't use a 'root' or 'admin' user for your app's connection.

Conclusion

Security is not a feature; it's a foundation. As Next.js continues to bridge the gap between client and server, understanding these vulnerabilities is crucial for any modern web developer. Keep your dependencies updated, validate everything, and never trust the client.

Zuhaib Rashid

Full Stack Developer

← More articles