TechLead
Lección 1 de 9
5 min de lectura
Seguridad Web

Introducción a la Seguridad Web

Comprende los fundamentos de la seguridad web, las amenazas comunes y por qué la seguridad es importante para todo desarrollador.

¿Qué es la Seguridad Web?

La seguridad web abarca todas las medidas tomadas para proteger sitios web, aplicaciones web y servicios web de amenazas cibernéticas. Como desarrollador, entender la seguridad no es opcional—es esencial para proteger a tus usuarios y tu organización.

Por Qué Importa la Seguridad Web

  • Confianza del Usuario - Los usuarios esperan que sus datos estén protegidos
  • Cumplimiento Legal - GDPR, HIPAA, PCI-DSS requieren medidas de seguridad
  • Impacto Financiero - Las brechas de datos cuestan millones en daños
  • Reputación - Los incidentes de seguridad pueden destruir la confianza en la marca
  • Continuidad del Negocio - Los ataques pueden tumbar los servicios

El OWASP Top 10

El Open Web Application Security Project (OWASP) mantiene una lista de los riesgos de seguridad más críticos para aplicaciones web:

  1. Control de Acceso Roto - Usuarios accediendo a recursos no autorizados
  2. Fallos Criptográficos - Encriptación débil o datos sensibles expuestos
  3. Inyección - Ataques de inyección SQL, NoSQL, comandos OS
  4. Diseño Inseguro - Fallos en la arquitectura de la aplicación
  5. Configuración de Seguridad Incorrecta - Configuraciones por defecto o incompletas
  6. Componentes Vulnerables - Uso de dependencias desactualizadas
  7. Fallos de Autenticación - Verificación de identidad rota
  8. Fallos de Integridad de Software - Actualizaciones no verificadas o problemas de CI/CD
  9. Fallos de Registro - Monitoreo y registro insuficientes
  10. Falsificación de Solicitud del Lado del Servidor - Ataques SSRF

Mentalidad de Seguridad

Adopta un enfoque de seguridad primero en tu desarrollo:

// MAL: Confiar en la entrada del usuario
const userId = req.query.userId;
const user = await db.query(`SELECT * FROM users WHERE id = ${userId}`);

// BIEN: Nunca confíes en la entrada del usuario
const userId = parseInt(req.query.userId, 10);
if (isNaN(userId)) {
  return res.status(400).json({ error: 'Invalid user ID' });
}
const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);

Defensa en Profundidad

Usa múltiples capas de controles de seguridad para que si una falla, las otras permanezcan:

Capa 1: Seguridad de Red (Firewalls, protección DDoS)
Capa 2: Seguridad de Transporte (HTTPS, TLS)
Capa 3: Seguridad de Aplicación (Validación de entrada, codificación de salida)
Capa 4: Seguridad de Datos (Encriptación en reposo, controles de acceso)
Capa 5: Monitoreo (Registro, alertas, respuesta a incidentes)

Cabeceras de Seguridad

Cabeceras HTTP esenciales que toda aplicación debe configurar:

// Cabeceras de seguridad en Express.js
const helmet = require('helmet');
app.use(helmet());

// O manualmente:
app.use((req, res, next) => {
  // Prevenir clickjacking
  res.setHeader('X-Frame-Options', 'DENY');

  // Prevenir sniffing de tipo MIME
  res.setHeader('X-Content-Type-Options', 'nosniff');

  // Habilitar filtro XSS
  res.setHeader('X-XSS-Protection', '1; mode=block');

  // Controlar información del referrer
  res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');

  // Política de Seguridad de Contenido
  res.setHeader('Content-Security-Policy', "default-src 'self'");

  next();
});

Cabeceras de Seguridad en Next.js

// next.config.js
module.exports = {
  async headers() {
    return [
      {
        source: '/:path*',
        headers: [
          { key: 'X-Frame-Options', value: 'DENY' },
          { key: 'X-Content-Type-Options', value: 'nosniff' },
          { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
          { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
        ],
      },
    ];
  },
};

Principios de Seguridad

  • Mínimo Privilegio - Otorga los permisos mínimos necesarios
  • Fallar de Forma Segura - Los errores deben resultar en un estado seguro por defecto
  • No Confiar en la Entrada - Valida y sanitiza todo
  • Defensa en Profundidad - Múltiples capas de seguridad
  • Mantenerlo Simple - Los sistemas complejos tienen más vulnerabilidades
  • Seguridad por Diseño - Construye la seguridad desde el inicio

Continuar Aprendiendo