Tema 3
Las APIs REST se apoyan en HTTP para transportar solicitudes y respuestas. Entender bien métodos, cabeceras y códigos de estado no es solo un asunto de protocolo: es una condición necesaria para diseñar controles de seguridad correctos, evitar ambigüedades y reducir exposición.
REST se construye sobre HTTP. Eso significa que la seguridad de una API no depende solo de sus reglas de negocio, sino también de cómo usa el protocolo subyacente. Un mal uso de métodos, cabeceras o códigos de estado puede abrir la puerta a bypass de controles, filtración de información, cacheo indebido o comportamientos inesperados en clientes y proxies.
Con frecuencia, los problemas no aparecen porque HTTP sea inseguro, sino porque la API utiliza el protocolo de manera inconsistente. Por ejemplo, endpoints que cambian estado con `GET`, respuestas sensibles marcadas como cacheables o errores que revelan demasiado detalle técnico.
Por eso, este tema estudia HTTP desde una perspectiva de seguridad aplicada a APIs REST.
HTTP no es solo un canal de transporte. Define una semántica de interacción entre cliente y servidor: cómo se representa un recurso, qué intención expresa cada método, qué metadatos acompañan la solicitud y cómo debe interpretarse el resultado.
Cuando la API respeta esa semántica, es más fácil aplicar controles y razonar sobre riesgos. Cuando la rompe, aparecen ambigüedades que afectan autenticación, autorización, cacheo, monitoreo y auditoría.
Una solicitud HTTP suele incluir varios elementos, y todos pueden tener relevancia de seguridad:
Cada una de estas partes debe tratarse como entrada no confiable. Aunque algunas parezcan controladas por clientes “legítimos”, todas pueden ser manipuladas por un atacante.
Los métodos HTTP expresan la naturaleza general de la operación. En seguridad, respetar su semántica es clave para evitar acciones ocultas, controles inconsistentes y efectos secundarios inesperados.
| Método | Uso esperado | Riesgo si se usa mal |
|---|---|---|
| GET | Leer recursos sin modificar estado | Cacheo de datos sensibles, ejecución de acciones ocultas |
| POST | Crear recursos o ejecutar acciones no idempotentes | Creación masiva, abuso funcional, replay |
| PUT | Reemplazar un recurso completo | Sobrescritura accidental o no autorizada |
| PATCH | Modificar parcialmente un recurso | Actualizaciones parciales mal validadas |
| DELETE | Eliminar un recurso | Borrado indebido o impacto severo sobre integridad |
| HEAD / OPTIONS | Descubrimiento o metadatos | Reconocimiento de capacidades y políticas |
`GET` debería ser un método seguro en el sentido de no producir cambios de estado en el servidor. Si una API usa `GET` para activar acciones, enviar correos, confirmar operaciones o modificar datos, rompe esa expectativa y crea varios riesgos.
En APIs seguras, `GET` debe utilizarse para consulta y recuperación, no para acciones con efectos colaterales.
Desde una mirada superficial, estos métodos parecen equivalentes porque todos “envían datos”. Pero desde seguridad, la diferencia importa mucho.
`DELETE` expresa intención destructiva y por eso merece controles reforzados. No basta con verificar que el usuario esté autenticado; hay que validar si realmente tiene permiso para eliminar ese recurso en ese contexto.
También conviene considerar:
La idempotencia indica que repetir la misma solicitud produce el mismo resultado observable. Es un concepto importante porque afecta retries, clientes distribuidos, proxies y resistencia ante fallos de red.
Desde seguridad, una operación no idempotente mal diseñada puede ser explotada mediante reenvíos intencionales, duplicación de solicitudes o automatización. Esto es especialmente relevante en pagos, altas de recursos, emisión de cupones o acciones administrativas.
Una arquitectura segura distingue claramente qué operaciones pueden repetirse sin daño y cuáles requieren controles contra replay, llaves de idempotencia o lógica de deduplicación.
Las cabeceras transportan metadatos críticos y muchas veces condicionan la forma en que la API autentica, interpreta y responde a una solicitud.
| Cabecera | Uso | Riesgo asociado |
|---|---|---|
| Authorization | Enviar credenciales o tokens | Robo, logging accidental, replay |
| Content-Type | Indicar formato del cuerpo | Parsing ambiguo o bypass de validaciones |
| Accept | Definir formato esperado de respuesta | Exposición de formatos no previstos |
| Origin | Aplicar políticas CORS | Exposición cruzada a clientes web |
| Cookie | Transportar sesión | Robo de sesión, CSRF, mezcla de contextos |
| X-Forwarded-For y similares | Informar IP original detrás de proxies | Suplantación si no se confía correctamente en proxies |
La cabecera `Authorization` suele contener uno de los activos más sensibles de la API: tokens Bearer, Basic Auth o esquemas personalizados. Un tratamiento incorrecto de esta cabecera puede exponer credenciales en logs, errores, trazas o herramientas de monitoreo.
Buenas prácticas básicas:
Una API debe saber exactamente qué formato de entrada acepta y cómo lo procesa. Si el `Content-Type` no se valida o el servidor intenta adivinar el formato, pueden aparecer ambigüedades y bypass de controles.
Ejemplos de problemas:
Los parámetros en la URL son útiles para filtros y paginación, pero presentan riesgos particulares. A diferencia del cuerpo, suelen quedar más expuestos en logs de servidores, proxies, herramientas de monitoreo, historiales de navegador y enlaces compartidos.
Por eso, no conviene enviar en query strings:
Los códigos de estado ayudan a clientes, gateways y sistemas de monitoreo a interpretar el resultado de una operación. Si se usan de forma incoherente, la API filtra información, confunde consumidores y dificulta respuesta ante incidentes.
| Código | Uso general | Riesgo si se usa mal |
|---|---|---|
| 200 / 204 | Operación exitosa | Ocultar fallos o condiciones relevantes |
| 400 | Solicitud inválida | Mensajes demasiado detallados sobre validación interna |
| 401 | No autenticado o token inválido | Revelar demasiado sobre credenciales o expiración |
| 403 | Autenticado pero no autorizado | Ayudar a distinguir recursos existentes de inexistentes |
| 404 | Recurso no encontrado | Usarlo de forma distinta según el caso puede facilitar enumeración |
| 500 | Error interno | Fuga de stack traces, nombres internos o detalles técnicos |
Estos códigos suelen ser fuente de errores de diseño. Desde seguridad, la diferencia entre “no autenticado”, “no autorizado” y “no encontrado” puede tener impacto en enumeración de recursos y perfilado del sistema.
No existe una única regla universal. Lo importante es que la política sea consistente y no revele información útil para un atacante.
Los mensajes de error suelen ser una fuente silenciosa de exposición. Un error demasiado detallado puede revelar nombres de tablas, rutas internas, formatos esperados, existencia de usuarios, estados de negocio o dependencias tecnológicas.
Una respuesta de error segura debería:
HTTP permite cachear respuestas para mejorar rendimiento, pero una mala política de cacheo puede exponer información sensible. Si una respuesta con datos privados se marca incorrectamente como pública o cacheable, otros usuarios, proxies o clientes compartidos podrían acceder a ella.
En APIs con datos sensibles, conviene revisar explícitamente:
Muchas APIs operan detrás de reverse proxies, load balancers o API gateways. En esos entornos, parte de la información relevante llega por cabeceras agregadas por infraestructura intermedia, como IP original, protocolo o host efectivo.
El problema aparece cuando el backend confía ciegamente en cabeceras que también podrían ser enviadas por el cliente. Si la cadena de confianza no está bien definida, un atacante puede falsificar origen, saltar controles contextuales o alterar auditoría.
Diseñar una API segura requiere entender HTTP con precisión. Los métodos, cabeceras, códigos de estado y reglas de cacheo no son detalles menores: condicionan cómo interactúan los clientes, cómo se aplican los controles y cuánta información puede aprender un atacante observando el comportamiento del sistema.
En el próximo tema estudiaremos las amenazas comunes en APIs REST, como abuso, enumeración, exfiltración y automatización maliciosa, para ver cómo estos riesgos se manifiestan en escenarios reales.