Introducción

En este tema, abordaremos el concepto de CORS (Cross-Origin Resource Sharing) y su importancia en la seguridad de las APIs RESTful. También discutiremos diversas políticas de seguridad que se deben implementar para proteger las APIs de accesos no autorizados y ataques maliciosos.

¿Qué es CORS?

CORS es un mecanismo que utiliza cabeceras HTTP para permitir que un servidor indique cualquier origen (dominio, esquema o puerto) distinto del suyo propio desde el cual un navegador debería permitir la carga de recursos. Es una medida de seguridad que previene que un sitio web cargue recursos de otro dominio sin permiso.

Conceptos Clave de CORS

  • Origen: Se refiere a la combinación de protocolo, dominio y puerto de una URL.
  • Cabeceras CORS: Son cabeceras HTTP específicas que controlan el acceso entre orígenes.

Cabeceras CORS Comunes

  1. Access-Control-Allow-Origin: Especifica qué orígenes pueden acceder a los recursos.
  2. Access-Control-Allow-Methods: Indica los métodos HTTP permitidos (GET, POST, PUT, DELETE, etc.).
  3. Access-Control-Allow-Headers: Lista de cabeceras permitidas en la solicitud.
  4. Access-Control-Allow-Credentials: Indica si las credenciales (cookies, cabeceras de autorización) pueden ser enviadas.
  5. Access-Control-Expose-Headers: Lista de cabeceras que pueden ser expuestas al navegador.

Ejemplo de Configuración de CORS

// Ejemplo en Node.js con Express
const express = require('express');
const cors = require('cors');
const app = express();

const corsOptions = {
  origin: 'http://example.com', // Permitir solo este origen
  methods: 'GET,POST,PUT,DELETE', // Métodos permitidos
  allowedHeaders: 'Content-Type,Authorization', // Cabeceras permitidas
  credentials: true // Permitir envío de credenciales
};

app.use(cors(corsOptions));

app.get('/api/data', (req, res) => {
  res.json({ message: 'Datos accesibles desde http://example.com' });
});

app.listen(3000, () => {
  console.log('Servidor corriendo en el puerto 3000');
});

Políticas de Seguridad

Además de CORS, es esencial implementar varias políticas de seguridad para proteger las APIs RESTful de accesos no autorizados y ataques maliciosos.

Autenticación y Autorización

  • Autenticación: Verifica la identidad del usuario. Ejemplos incluyen JWT (JSON Web Tokens), OAuth, y API Keys.
  • Autorización: Determina qué recursos puede acceder el usuario autenticado.

Validación de Datos

  • Validación de Entrada: Asegúrate de que todos los datos recibidos sean válidos y seguros.
  • Sanitización de Datos: Limpia los datos para evitar inyecciones de código y otros ataques.

Protección contra Ataques Comunes

  1. Inyección SQL: Usa ORM (Object-Relational Mapping) y consultas preparadas.
  2. Cross-Site Scripting (XSS): Escapa y sanitiza todos los datos de entrada y salida.
  3. Cross-Site Request Forgery (CSRF): Implementa tokens CSRF para verificar la autenticidad de las solicitudes.

Uso de HTTPS

  • HTTPS: Asegura la comunicación entre el cliente y el servidor mediante cifrado SSL/TLS.

Rate Limiting y Throttling

  • Rate Limiting: Limita el número de solicitudes que un usuario puede hacer en un periodo de tiempo.
  • Throttling: Controla la cantidad de datos que un usuario puede enviar o recibir.

Ejemplo de Implementación de Rate Limiting

// Ejemplo en Node.js con Express y express-rate-limit
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 100, // Limitar cada IP a 100 solicitudes por ventana de tiempo
  message: 'Demasiadas solicitudes desde esta IP, por favor intenta de nuevo después de 15 minutos'
});

app.use('/api/', limiter);

Ejercicio Práctico

Ejercicio 1: Configuración de CORS

Configura CORS en un servidor Express para permitir solicitudes desde http://myfrontend.com y permitir solo los métodos GET y POST.

Solución

const express = require('express');
const cors = require('cors');
const app = express();

const corsOptions = {
  origin: 'http://myfrontend.com',
  methods: 'GET,POST'
};

app.use(cors(corsOptions));

app.get('/api/data', (req, res) => {
  res.json({ message: 'Datos accesibles desde http://myfrontend.com' });
});

app.listen(3000, () => {
  console.log('Servidor corriendo en el puerto 3000');
});

Ejercicio 2: Implementación de Rate Limiting

Implementa rate limiting en un servidor Express para limitar las solicitudes a 50 por cada 10 minutos.

Solución

const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 10 * 60 * 1000, // 10 minutos
  max: 50, // Limitar cada IP a 50 solicitudes por ventana de tiempo
  message: 'Demasiadas solicitudes desde esta IP, por favor intenta de nuevo después de 10 minutos'
});

app.use('/api/', limiter);

Conclusión

En esta sección, hemos aprendido sobre CORS y su importancia en la seguridad de las APIs RESTful. También discutimos diversas políticas de seguridad que son esenciales para proteger las APIs de accesos no autorizados y ataques maliciosos. Implementar estas medidas de seguridad es crucial para mantener la integridad y confidencialidad de los datos manejados por las APIs.

En el próximo módulo, exploraremos herramientas y frameworks que facilitan el desarrollo y la prueba de APIs RESTful.

© Copyright 2024. Todos los derechos reservados