Poner una aplicación web en producción sin pasar una checklist de seguridad es como entregar las llaves de tu casa con la puerta abierta. Esta lista de 20 verificaciones cubre los puntos críticos que debes comprobar antes de que tu aplicación sea accesible públicamente.
HTTPS y cifrado
1. Certificado SSL/TLS válido
- [ ] Certificado emitido por una CA reconocida (Let's Encrypt, DigiCert)
- [ ] Fecha de expiración con margen suficiente (alertas configuradas)
- [ ] Cadena de certificados completa (incluyendo intermedios)
2. Versión TLS
- [ ] TLS 1.2 como versión mínima
- [ ] TLS 1.3 habilitado y preferido
- [ ] TLS 1.0 y 1.1 desactivados
- [ ] SSL v2 y v3 desactivados
3. Redirección HTTPS
- [ ] Redirección 301 de HTTP a HTTPS
- [ ] HSTS habilitado (
Strict-Transport-Security) - [ ] No hay contenido mixto (mixed content)
Headers de seguridad
4. Headers obligatorios
- [ ]
Strict-Transport-Security: max-age=31536000; includeSubDomains - [ ]
X-Content-Type-Options: nosniff - [ ]
X-Frame-Options: SAMEORIGIN - [ ]
Referrer-Policy: strict-origin-when-cross-origin
5. Content Security Policy
- [ ] CSP configurada y funcionando
- [ ]
script-srcrestrictivo (nounsafe-inlineniunsafe-evalsi posible) - [ ]
default-src 'self'como base - [ ] Report-uri o report-to configurado para monitorizar violaciones
6. CORS
- [ ]
Access-Control-Allow-Originrestrictivo (no*en producción) - [ ] Métodos permitidos específicos (no
*) - [ ] Headers permitidos explícitos
Autenticación y sesiones
7. Contraseñas
- [ ] Hashing con bcrypt, argon2 o scrypt (nunca MD5/SHA1)
- [ ] Salt único por usuario
- [ ] Política de complejidad mínima (12+ caracteres)
- [ ] No almacenar contraseñas en claro en ningún lugar (logs, BD, emails)
8. Sesiones
- [ ] Tokens de sesión con entropía suficiente
- [ ] Cookies de sesión:
Secure,HttpOnly,SameSite=Lax - [ ] Expiración de sesión razonable (30 min inactividad, 24h máximo)
- [ ] Regeneración de token tras login
9. MFA
- [ ] MFA disponible para todos los usuarios
- [ ] MFA obligatorio para cuentas admin
- [ ] Códigos de recuperación proporcionados
Validación y protección de datos
10. Validación de inputs
- [ ] Validación server-side para TODOS los inputs (Zod, Joi, Yup)
- [ ] Validación client-side como mejora UX (nunca como único control)
- [ ] Sanitización de outputs (prevención XSS)
- [ ] Prevención de inyección SQL (queries parametrizadas, ORM)
11. Rate limiting
- [ ] Rate limiting en endpoints de autenticación (login, registro, reset password)
- [ ] Rate limiting en API endpoints (por IP y por usuario)
- [ ] Rate limiting en formularios públicos (contacto, newsletter)
12. Upload de archivos
- [ ] Validación de tipo MIME real (no solo extensión)
- [ ] Límite de tamaño configurado
- [ ] Archivos almacenados fuera del directorio web
- [ ] Nombres de archivo regenerados (no usar el nombre original)
- [ ] Escaneo antivirus si aplica
Infraestructura
13. Variables de entorno
- [ ] Todas las credenciales en variables de entorno (no en código)
- [ ] Archivo
.enven.gitignore - [ ]
.env.examplesin valores reales - [ ] Validación de env vars al arrancar (Zod)
14. Errores y logs
- [ ] Mensajes de error genéricos para el usuario (no stack traces)
- [ ] Stack traces y errores detallados solo en logs del servidor
- [ ] Logs no contienen datos sensibles (contraseñas, tokens, PII)
- [ ] Centralización de logs (Sentry, ELK, Datadog)
- [ ] Alertas configuradas para errores críticos
15. Dependencias
- [ ]
npm auditopnpm auditsin vulnerabilidades críticas - [ ] Dependencias actualizadas (especialmente las de seguridad)
- [ ] Lock file (
package-lock.jsonopnpm-lock.yaml) commiteado - [ ] No hay dependencias con licencias incompatibles
Base de datos
16. Seguridad BD
- [ ] Credenciales únicas por entorno (dev ≠ staging ≠ prod)
- [ ] Conexión cifrada (SSL) a la base de datos
- [ ] Usuario de BD con mínimos privilegios necesarios
- [ ] Backups automáticos configurados y verificados
- [ ] No hay acceso público directo a la BD (solo desde el backend)
Configuración del servidor
17. Server hardening
- [ ] Información del servidor oculta (no revelar versión de nginx/Apache)
- [ ] Directory listing desactivado
- [ ] Archivos sensibles bloqueados (.git, .env, backups, logs)
- [ ] Puertos innecesarios cerrados
- [ ] Firewall configurado
18. DNS y dominio
- [ ] Registros DNS correctos (A, AAAA, CNAME)
- [ ] SPF, DKIM y DMARC configurados para emails
- [ ] CAA record si quieres restringir CAs
- [ ] DNSSEC si tu registrador lo soporta
Cumplimiento legal
19. RGPD y privacidad
- [ ] Política de privacidad publicada y accesible
- [ ] Banner de cookies conforme (aceptar + rechazar visibles)
- [ ] Cookies no esenciales bloqueadas antes del consentimiento
- [ ] Formularios con checkbox de consentimiento
- [ ] Canal para ejercicio de derechos ARCO
20. Escaneo final
- [ ] Escaneo WarDek completo ejecutado
- [ ] Puntuación OWASP ≥ 70/100
- [ ] Puntuación RGPD ≥ 70/100
- [ ] Todos los problemas críticos corregidos
- [ ] Problemas medios planificados para corrección
Puntuación pre-producción
| Checks completados | Resultado | Acción | |-------------------|-----------|--------| | 18-20 | Listo para producción | Deploy con confianza | | 14-17 | Casi listo | Corregir los puntos faltantes antes de deploy | | 10-13 | No listo | Riesgos significativos, corregir antes de exponer | | Menos de 10 | Crítico | No desplegar hasta resolver |
Escanea tu sitio web gratis con WarDek — OWASP, NIS2, RGPD, AI Act en un solo escaneo.