Exposición de Secretos en __NEXT_DATA__
Los props de página de Next.js pasados por getServerSideProps o getStaticProps filtran datos sensibles como API keys, URLs de base de datos o configuración interna a través del script tag __NEXT_DATA__.
Cómo Funciona
En Next.js, los datos retornados de getServerSideProps o getStaticProps se serializan en un objeto JSON __NEXT_DATA__ embebido en el HTML como un script tag. Estos datos son visibles para cualquiera que vea el source de la página. Los devs frecuentemente hacen fetch de datos server-side y accidentalmente pasan el objeto de respuesta completo — incluyendo API keys, URLs internas, tokens de usuario o strings de conexión a base de datos — como props de página. Aunque la UI solo muestre un subconjunto de los datos, el objeto completo queda expuesto en __NEXT_DATA__.
export async function getServerSideProps() {
const res = await fetch('https://api.internal.com/users', {
headers: { 'X-API-Key': process.env.INTERNAL_API_KEY }
});
const data = await res.json();
// Entire response including internal fields passed to client
return { props: { data } };
}export async function getServerSideProps() {
const res = await fetch('https://api.internal.com/users', {
headers: { 'X-API-Key': process.env.INTERNAL_API_KEY }
});
const data = await res.json();
// Only pass the fields the UI actually needs
const safeData = data.map(u => ({
id: u.id, name: u.name, avatar: u.avatar
}));
return { props: { users: safeData } };
}Ejemplo Real
En 2022, investigadores de seguridad encontraron múltiples aplicaciones Next.js filtrando Stripe secret keys, strings de conexión a base de datos y tokens de API internos a través de __NEXT_DATA__. Un sitio de e-commerce expuso su Stripe secret key, que podía ser usada para emitir reembolsos o acceder a datos de pago.
Cómo Prevenirlo
- Solo retorna los campos específicos que necesita la UI en los props de página
- Nunca pases respuestas completas de API o registros de base de datos como props
- Audita __NEXT_DATA__ en producción viendo el source de la página
- Usa Next.js App Router con Server Components para evitar serializar datos sensibles
Tecnologías Afectadas
Data Hogo detecta esta vulnerabilidad automáticamente.
Escanea Tu Repo GratisVulnerabilidades Relacionadas
dangerouslySetInnerHTML Sin Sanitización
highUsar dangerouslySetInnerHTML de React con input de usuario sin sanitizar permite a atacantes inyectar scripts maliciosos que se ejecutan en los navegadores de otros usuarios.
Tokens de Autenticación en localStorage
highGuardar JWT tokens, tokens de sesión o API keys en localStorage los hace accesibles a cualquier JavaScript corriendo en la página, incluyendo payloads XSS.
Source Maps Expuestos en Producción
mediumLos archivos source map de JavaScript (.map) son públicamente accesibles en producción, revelando el código fuente original completo incluyendo comentarios, nombres de variables y lógica interna.
CORS Abierto en API Routes de Next.js
mediumLas API routes de Next.js configuradas con Access-Control-Allow-Origin: * permiten a cualquier sitio web hacer requests cross-origin autenticados, habilitando ataques tipo CSRF.