Saltar al contenidoPedro Farbo
Lección 20 / 2550 min

Seguridad de la API

Seguridad de API

Implementa las mejores prácticas de seguridad en tu API.

Instalación

bash
npm install helmet cors express-rate-limit hpp xss-clean

Configuración de Helmet

typescript
// src/app.tsimport helmet from 'helmet'; // Headers de seguridadapp.use(helmet()); // CSP personalizadoapp.use(helmet.contentSecurityPolicy({  directives: {    defaultSrc: ["'self'"],    styleSrc: ["'self'", "'unsafe-inline'"],    imgSrc: ["'self'", 'data:', 'https:'],  },}));

CORS Configurado

typescript
import cors from 'cors'; const corsOptions = {  origin: (origin: string | undefined, callback: Function) => {    const allowedOrigins = [      'https://ecommerce.com',      'https://www.ecommerce.com',    ];     // Permitir requests sin origin (mobile, Postman)    if (!origin || allowedOrigins.includes(origin)) {      callback(null, true);    } else {      callback(new Error('No permitido por CORS'));    }  },  credentials: true,  methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],  allowedHeaders: ['Content-Type', 'Authorization'],}; app.use(cors(corsOptions));

Rate Limiting

typescript
import rateLimit from 'express-rate-limit'; // Límite globalconst globalLimiter = rateLimit({  windowMs: 15 * 60 * 1000, // 15 minutos  max: 100,  message: { error: 'Demasiadas solicitudes' },  standardHeaders: true,  legacyHeaders: false,}); // Límite para authconst authLimiter = rateLimit({  windowMs: 60 * 60 * 1000, // 1 hora  max: 5,  message: { error: 'Demasiados intentos. Intente más tarde.' },}); app.use('/api', globalLimiter);app.use('/api/auth/login', authLimiter);

Protección contra Ataques

typescript
import hpp from 'hpp';import xssClean from 'xss-clean'; // Prevenir HTTP Parameter Pollutionapp.use(hpp()); // Sanitizar inputs (XSS)app.use(xssClean()); // Limitar tamaño de bodyapp.use(express.json({ limit: '10kb' }));

Variables de Entorno Seguras

typescript
// src/config/env.tsimport { z } from 'zod'; const envSchema = z.object({  NODE_ENV: z.enum(['development', 'production', 'test']),  PORT: z.string().transform(Number),  DATABASE_URL: z.string().url(),  JWT_SECRET: z.string().min(32),  REDIS_URL: z.string().url(),}); export const env = envSchema.parse(process.env);

Protección de Rutas Sensibles

typescript
// Ocultar errores en producciónapp.use((err: Error, req: Request, res: Response, next: NextFunction) => {  const statusCode = err instanceof AppError ? err.statusCode : 500;   res.status(statusCode).json({    error: process.env.NODE_ENV === 'production'      ? 'Error interno'      : err.message,    ...(process.env.NODE_ENV !== 'production' && { stack: err.stack }),  });});

Checklist de Seguridad

  • ✅ HTTPS en producción
  • ✅ Headers de seguridad (Helmet)
  • ✅ CORS configurado
  • ✅ Rate limiting
  • ✅ Validación de inputs
  • ✅ Sanitización XSS
  • ✅ Contraseñas hasheadas (bcrypt)
  • ✅ JWT con expiración
  • ✅ Variables de entorno validadas

Resumen

  • ✅ Helmet para headers seguros
  • ✅ CORS restrictivo
  • ✅ Rate limiting por ruta
  • ✅ Protección XSS y HPP

Próxima clase: Docker y Contenedores! 🚀

¿Te gustó el contenido? ¡Tu contribución ayuda a mantener todo online y gratuito!

PIX:0737160d-e98f-4a65-8392-5dba70e7ff3e