seguridad API · autenticación · autorización · validación de entradas · CORS · OWASP · desarrolladores independientes
Seguridad API: Lo Básico que Todo Equipo Pequeño Debe Dominar
Una guía práctica sobre autenticación, autorización, validación de entradas y CORS para desarrolladores independientes que construyen APIs sin un equipo de seguridad.
Publicado:
Por Qué la Seguridad API Importa para Equipos Pequeños
Si estás construyendo APIs como desarrollador independiente o en un equipo pequeño de software, podrías asumir que la seguridad es algo reservado para grandes organizaciones con equipos dedicados. Esa suposición es incorrecta. Las APIs son cada vez más objetivo de atacantes precisamente porque los equipos pequeños suelen priorizar funcionalidades antes que endurecimiento. El Proyecto de Seguridad API de OWASP existe para cerrar esta brecha, señalando que “muchas APIs no pasan por las pruebas de seguridad rigurosas que ayudarían a hacerlas seguras contra ataques” [1].
Este artículo cubre las medidas de seguridad esenciales que toda API pequeña debería implementar: autenticación, autorización, cifrado en tránsito, validación de entradas y evitar errores comunes como un CORS permisivo en exceso. Sin relleno, sin métricas inventadas—solo los compromisos que necesitas entender.
Autenticación vs. Autorización: Dos Problemas Diferentes
Estos dos términos se usan frecuentemente de forma intercambiable, pero resuelven problemas distintos. La autenticación responde a la pregunta: “¿Quién eres?” La autorización responde a: “¿Qué tienes permiso para hacer?”
Autenticación
La autenticación es el proceso de verificar la identidad del que llama. Para APIs, esto típicamente significa emitir y validar tokens. El OWASP Top 10 de Seguridad API lista “Autenticación Rotas” como API2:2023, advirtiendo que “los mecanismos de autenticación a menudo se implementan incorrectamente, permitiendo a los atacantes comprometer tokens de autenticación o explotar defectos de implementación para asumir la identidad de otros usuarios” [3].
Pasos prácticos para equipos pequeños:
- Usa formatos de token establecidos. Los JWT son ampliamente soportados pero requieren manejo cuidadoso. Nunca confíes en claims sin validación. Usa tokens de acceso de vida corta combinados con tokens de actualización para sesiones más largas.
- Nunca almacenes secretos en código del lado del cliente. Las claves de API embebidas en JavaScript que corre en el navegador son visibles para cualquiera que inspeccione el código fuente.
- Aplica contextos seguros. El navegador restringe muchas APIs poderosas a contextos seguros—aquellos entregados sobre TLS [7]. Esto no es opcional si tu API maneja datos sensibles. Un atacante de intermediario en una conexión no cifrada puede interceptar tokens, credenciales y datos de usuario.
Autorización
La autorización controla a qué puede acceder un usuario autenticado. El modo de fallo más común para equipos pequeños es la autorización a nivel de objeto rota. OWASP API1:2023 describe esto como APIs que exponen endpoints que manejan identificadores de objeto sin verificar si el solicitante posee o está autorizado para acceder a ese objeto específico [3].
Considera un endpoint como GET /api/pedidos/12345. Si tu código simplemente busca el pedido 12345 por el ID en la URL y lo devuelve, cualquier usuario autenticado puede enumerar y acceder a cualquier pedido. La solución es sencilla: después de autenticar al usuario, verifica que el pedido le pertenece antes de devolverlo.
De manera similar, OWASP API5:2023 destaca la autorización a nivel de función rota, donde políticas complejas de control de acceso con diferentes jerarquías y roles llevan a defectos que permiten a atacantes acceder a funciones administrativas [3]. Si tienes endpoints de administración, protégelos con verificaciones explícitas de rol, no solo con autenticación.
El Cifrado en Tránsito No es Opcional
Enviar datos de API sobre HTTP no cifrado es uno de los errores más simples y peligrosos que un equipo pequeño puede cometer. La documentación de MDN sobre Contextos Seguros explica que los contextos seguros existen para “prevenir que atacantes MITM accedan a APIs poderosas que podrían comprometer aún más a la víctima” [7]. Este principio aplica igualmente a tu servidor API.
Requisitos:
- Usa TLS 1.2 o superior. TLS 1.3 es preferible. Las versiones más antiguas tienen vulnerabilidades conocidas.
- Obtén certificados válidos. Los certificados autofirmados funcionan para desarrollo pero causarán fallos en producción y con la mayoría de consumidores de API. Usa Let’s Encrypt o una autoridad de certificación confiable.
- Honra el requisito de contexto seguro. Muchas APIs y características del navegador están restringidas a contextos seguros [8]. Si tu frontend llama a tu API sobre HTTP, esas características simplemente no funcionarán y tus tokens estarán expuestos.
Validación de Entradas: Tu Primera Línea de Defensa
La validación de entradas significa verificar que los datos recibidos por tu API se ajustan a lo que esperas. Sin ella, los atacantes pueden inyectar cargas maliciosas, desbordar buffers o manipular la lógica de tu aplicación.
Principios clave:
- Valida en el servidor, no solo en el cliente. La validación del lado del cliente es conveniente para la experiencia de usuario pero trivial de burlar. Cada endpoint de API debe validar sus propias entradas.
- Usa listas blancas, no listas negras. Rechazar patrones conocidos como malos es frágil. Aceptar solo las formas y rangos que esperas es mucho más robusto.
- Verifica tipos, longitudes y formatos. Un ID de usuario que debería ser un entero no debe aceptar una cadena. Un campo de email debe validar el formato antes de llegar a tu base de datos.
- Ten cuidado con la deserialización. Analizar JSON, XML u otros formatos serializados no confiables sin validación es un vector de ataque conocido. OWASP API7:2023 cubre la Falsificación de Solicitudes del Lado del Servidor, que ocurre “cuando una API obtiene un recurso remoto sin validar el URI proporcionado por el usuario” [3]. Si tu API acepta una URL y hace fetch desde ella, valida esa URL contra una lista blanca de dominios permitidos.
Riesgos de Seguridad de CORS
Cross-Origin Resource Sharing (CORS) es un mecanismo del navegador que controla si una página web de un origen puede solicitar recursos de otro. A menudo se configura incorrectamente, y la mala configuración es uno de los problemas más comunes de seguridad API.
Errores comunes:
- Usar
Access-Control-Allow-Origin: *. Este encabezado le dice al navegador que cualquier origen puede acceder a tu API. Si tu API requiere autenticación, esto efectivamente expone tus datos a cualquier sitio malicioso. La página del atacante puede hacer solicitudes a tu API en nombre de un usuario autenticado que tenga una sesión abierta. - Rebotar el origen de la solicitud. Algunos desarrolladores establecen dinámicamente
Access-Control-Allow-Originpara coincidir con el encabezadoOriginde la solicitud. Esto es ligeramente mejor que*pero aún riesgoso si aceptas cualquier origen. Valida el origen contra una lista blanca explícita en su lugar. - Confundir CORS con autorización. CORS es un mecanismo de aplicación del navegador, no un control de seguridad. Incluso si CORS bloquea una solicitud en el navegador, la solicitud aún llega a tu servidor. Tu servidor debe aplicar autenticación y autorización de forma independiente.
Guía práctica:
- Define una lista blanca explícita de orígenes que deberían acceder a tu API.
- Establece
Access-Control-Allow-Origina uno de esos orígenes, nunca a*para endpoints autenticados. - Expone solo los encabezados y métodos que tu API realmente necesita.
- Recuerda que CORS no protege tu API de clientes HTTP directos como
curlo Postman. Las verificaciones del lado del servidor siguen siendo requeridas.
Seguridad Operacional para Equipos Pequeños
La seguridad no es solo código. La guía de Seguridad Operacional de MDN enfatiza que los ataques a la cadena de suministro apuntan a los procesos que sigues para desarrollar y enviar software [9]. Para equipos pequeños, esto significa:
- Requiere autenticación fuerte para mantenedores del proyecto. Usa passkeys o autenticación multifactor en tus cuentas de control de versiones y despliegue. Las cuentas de mantenedores comprometidas son una vía directa para inyectar código malicioso.
- Implementa control de acceso basado en roles. No todos los miembros del equipo necesitan acceso de escritura a producción. Limita los privilegios a lo que cada persona realmente necesita.
- Evalúa las herramientas que usas. Las herramientas de terceros en tu pipeline de desarrollo—sistemas CI/CD, registros de paquetes, proveedores de hosting—son parte de tu superficie de ataque. Elige herramientas de proveedores reputados y mantén actualizados.
Errores Comunes a Evitar
- Asumir que tu API es demasiado pequeña para ser objetivo. Los atacantes usan escáneres automatizados que sondean millones de endpoints. El tamaño no te protege.
- Codificar secretos en el código. Las claves de API, contraseñas de base de datos y secretos de firma nunca deben aparecer en tu código fuente. Usa variables de entorno o un gestor de secretos.
- Ignorar los mensajes de error. Las respuestas de error detalladas pueden filtrar información sobre tu estructura interna, esquema de base de datos o trazado de pila. Devuelve mensajes de error genéricos a los clientes y registra los detalles del lado del servidor.
- Omitir la limitación de velocidad. OWASP API4:2023 cubre el consumo ilimitado de recursos, que puede llevar a denegación de servicio o aumento de costos operacionales cuando los atacantes abusan de tu API [3]. La limitación de velocidad es una defensa simple que previene tanto sobrecarga accidental como abuso intencional.
- Dejar endpoints de depuración habilitados en producción. OWASP API8:2023 aborda la mala configuración de seguridad, señalando que las configuraciones complejas son fáciles de configurar mal [3]. Audita tu configuración de producción regularmente y deshabilita cualquier cosa que no uses activamente.
Preguntas Frecuentes
¿Necesito un equipo de seguridad para asegurar mi API? No. Las medidas descritas aquí—autenticación, verificaciones de autorización, TLS, validación de entradas y configuración adecuada de CORS—son fundamentales y pueden implementarse por un equipo pequeño con esfuerzo enfocado.
¿Cómo sé si mi API es vulnerable? Comienza revisando tus endpoints contra el OWASP Top 10 de Seguridad API [3]. Luego prueba con herramientas como OWASP ZAP o Burp Suite Community Edition. Considera herramientas automatizadas de prueba de seguridad API que se integren en tu pipeline CI.
¿Son los JWT la opción correcta para autenticación? Los JWT son convenientes pero requieren implementación cuidadosa. El compromiso clave es que los JWT son autocontenidos, lo que significa que revocar un token comprometido es más difícil que con autenticación basada en sesiones. Para equipos pequeños, considera si un enfoque más simple basado en sesiones con almacenamiento de tokens del lado del servidor podría ser más fácil de manejar de forma segura.
¿Qué pasa con el versionado de APIs y la seguridad? Cada versión de API debe tratarse como un despliegue separado con su propia configuración de seguridad. No asumas que las medidas de seguridad de la v1 se aplican automáticamente a la v2.
Fuentes
[1] https://owasp.org/API-Security/editions/2019/en/0x03-introduction [2] https://owasp.org/www-project-api-security [3] https://owasp.org/API-Security/editions/2023/en/0x11-t10 [4] https://owasp.org/www-community/api_security_tools [5] https://owasp.org/API-Security [6] https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/User_activation [7] https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Secure_Contexts [8] https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Secure_Contexts/features_restricted_to_secure_contexts [9] https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Operational_security [10] https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage