Tokens de Autenticación en localStorage
Guardar 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.
Cómo Funciona
localStorage es accesible a cualquier JavaScript corriendo en el mismo origen. Si un atacante logra incluso una vulnerabilidad XSS menor, puede extraer todos los tokens con una sola línea: document.cookie está protegido por HttpOnly, pero localStorage no tiene tal protección. Los tokens robados permiten secuestro de sesión, toma de cuentas y abuso de API. A diferencia de cookies, los valores de localStorage nunca se envían automáticamente con requests, así que los devs deben adjuntarlos manualmente — frecuentemente de formas que los exponen a CSRF o XSS. Los tokens en localStorage también persisten después de cerrar el navegador, extendiendo la ventana de ataque.
// After login
const { token } = await response.json();
localStorage.setItem('auth_token', token);
// On every request
fetch('/api/data', {
headers: { Authorization: `Bearer ${localStorage.getItem('auth_token')}` }
});// Server sets HttpOnly cookie after login
// In API route:
res.setHeader('Set-Cookie', serialize('session', token, {
httpOnly: true,
secure: true,
sameSite: 'lax',
path: '/',
maxAge: 60 * 60 * 24 * 7
}));
// Client requests automatically include the cookie
fetch('/api/data', { credentials: 'include' });Ejemplo Real
En 2022, una vulnerabilidad XSS en un dashboard React popular permitió a atacantes robar JWTs del localStorage de usuarios admin. Los tokens tenían tiempos de expiración largos (30 días), dando a los atacantes acceso persistente a paneles admin y datos de clientes.
Cómo Prevenirlo
- Guarda tokens en cookies HttpOnly y Secure en vez de localStorage
- Configura SameSite=Lax o Strict en cookies de autenticación
- Usa tiempos de expiración cortos con rotación de refresh tokens
- Implementa Content Security Policy para reducir la superficie de ataque XSS
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.
Exposición de Secretos en __NEXT_DATA__
highLos 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__.
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.