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
- Access-Control-Allow-Origin: Especifica qué orígenes pueden acceder a los recursos.
- Access-Control-Allow-Methods: Indica los métodos HTTP permitidos (GET, POST, PUT, DELETE, etc.).
- Access-Control-Allow-Headers: Lista de cabeceras permitidas en la solicitud.
- Access-Control-Allow-Credentials: Indica si las credenciales (cookies, cabeceras de autorización) pueden ser enviadas.
- 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
- Inyección SQL: Usa ORM (Object-Relational Mapping) y consultas preparadas.
- Cross-Site Scripting (XSS): Escapa y sanitiza todos los datos de entrada y salida.
- 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.
Curso de REST API: Principios de Diseño y Desarrollo de APIs RESTful
Módulo 1: Introducción a las APIs RESTful
Módulo 2: Diseño de APIs RESTful
- Principios de diseño de APIs RESTful
- Recursos y URIs
- Métodos HTTP
- Códigos de estado HTTP
- Versionado de APIs
- Documentación de APIs
Módulo 3: Desarrollo de APIs RESTful
- Configuración del entorno de desarrollo
- Creación de un servidor básico
- Manejo de peticiones y respuestas
- Autenticación y autorización
- Manejo de errores
- Pruebas y validación
Módulo 4: Buenas Prácticas y Seguridad
- Buenas prácticas en el diseño de APIs
- Seguridad en APIs RESTful
- Rate limiting y throttling
- CORS y políticas de seguridad
Módulo 5: Herramientas y Frameworks
- Postman para pruebas de APIs
- Swagger para documentación
- Frameworks populares para APIs RESTful
- Integración continua y despliegue