Listas de control de seguridad, perspectivas de revisión del código y plantillas de políticas para equipos de desarrollo.
Elementos que deben verificarse antes de desarrollar un nuevo punto final de API.
Perspectivas de seguridad a comprobar durante las revisiones del código de la API.
| Comprobar artículo | Importancia | Explicación |
|---|---|---|
| El middleware de autenticación se aplica a todos los puntos finales | Requerido | Garantizar que no falte ninguna comprobación de autenticación excepto en las API públicas. |
| Existen comprobaciones de autorización a nivel de objeto | Requerido | Verificar que los recursos solicitados pertenecen al usuario solicitante |
| Las funciones de administración tienen verificación de funciones | Requerido | Garantizar que los usuarios normales no puedan llamar a las API de administración |
| El algoritmo se especifica durante la verificación JWT | Requerido | Prevención de alg: ningún ataque |
| La caducidad del token está correctamente configurada | Recomendado | Ficha de acceso: en 15 minutos |
| Comprobar artículo | Importancia | Explicación |
|---|---|---|
| El cuerpo de la solicitud tiene validación de esquema | Requerido | Validación de tipo, longitud y formato |
| Las consultas SQL están parametrizadas | Requerido | Garantizar que las consultas no se construyan con concatenación de cadenas |
| Existe validación del formato de los parámetros de ruta | Requerido | Compruebe el formato esperado, como UUID |
| Los parámetros de paginación tienen límites superiores | Recomendado | Evitar solicitudes excesivas como limit=999999 |
| La carga de archivos tiene restricciones de tipo y tamaño | Recomendado | Validación del tipo de contenido y del tamaño del archivo |
| Comprobar artículo | Importancia | Explicación |
|---|---|---|
| Las respuestas no contienen campos innecesarios | Requerido | Evitar la filtración de password_hash, ID internos, etc. |
| Las respuestas de error no contienen trazas de pila | Requerido | No exponga información interna en producción |
| Las cabeceras de seguridad están configuradas | Recomendado | X-Content-Type-Options, HSTS, etc. |
| Content-Type está correctamente configurado | Recomendado | Especificar explícitamente application/json |
| Comprobar artículo | Importancia | Explicación |
|---|---|---|
| Se aplica la limitación de velocidad | Requerido | Especialmente para los puntos finales de autenticación y pago |
| Se registran los datos adecuados | Recomendado | Trazabilidad: quién hizo qué y cuándo |
| Los secretos no están codificados | Requerido | Utilizar variables de entorno o gestores secretos |
| La configuración CORS es adecuada | Recomendado | Evitar el uso de comodines |
| Las dependencias no tienen vulnerabilidades conocidas | Recomendado | Comprobar los resultados de la auditoría npm / Snyk |
Plantillas para políticas básicas en el desarrollo de API internas. Personalícelas para adaptarlas a su proyecto.
■ Métodos de autenticación - APIs de cara al usuario: OAuth 2.0 (código de autorización + PKCE) - APIs de servidor a servidor: OAuth 2.0 (credenciales de cliente) o mTLS - API de integración externa: Clave API + firma HMAC ■ Gestión de tokens - Caducidad de token de acceso: 15 minutos - Caducidad del token de actualización: 7 días (se requiere rotación) - Almacenamiento de tokens: HttpOnly + Seguro + Cookie SameSite Política de contraseñas - Mínimo 12 caracteres, al menos una mayúscula, una minúscula, un número y un símbolo - Hash con bcrypt (factor de coste 12 o superior) - Protección contra ataques a listas de contraseñas (integración con la API Have I Been Pwned)
Gestión de versiones - Gestión de versiones mediante ruta URL: /api/v1/recursos - Periodo de soporte mínimo de 6 meses para versiones antiguas - Notificación de obsoletos a través de la cabecera Deprecation ■ Limitación de tarifas (valores por defecto) - API generales: 100 peticiones/15 min - API de autenticación: 5 peticiones/15 min - API públicas: 30 solicitudes/min - Devuelve siempre cabeceras RateLimit-* ■ Respuestas - Content-Type: application/json (fijo) - Respuestas de error en formato RFC 7807 (Detalles del problema) - Nunca devuelve trazas de pila en producción - Paginación: por defecto 20 elementos, máximo 100 elementos
■ Campos de registro obligatorios - Sello de tiempo (ISO 8601, UTC) - ID de solicitud (UUID para la trazabilidad) - ID de usuario / ID de cliente de API - Método HTTP + punto final - Código de estado - IP de origen - Tiempo de respuesta ■ Campos de registro prohibidos (datos sensibles) - Contraseñas / Tokens / Claves API - Números de tarjetas de crédito - Visualización completa de PII (se requiere enmascaramiento) Alertas de supervisión - Fallos de autenticación: Alerta a partir de 5/min - Errores 403: Alerta a 10+/min - 500 errores: Alerta inmediata en 1 ocurrencia - Límite de velocidad superado: Análisis de patrones
Detectar incidentes mediante alertas de supervisión, informes de usuarios o notificaciones externas. Determinar la gravedad mediante el triaje inicial.
0-30 minutosPrevenir la escalada de daños. Invalide las claves API, suspenda temporalmente los endpoints afectados e identifique el alcance del impacto.
30 min - 2 horasSolucionar las vulnerabilidades, aplicar parches y restablecer los servicios. Notificar a los usuarios afectados.
2-24 horasRealizar la autopsia. Realice un análisis de la causa raíz, desarrolle medidas de prevención de la recurrencia y documente los resultados.
1-5 días laborablesAdditional checklist items for systems integrating AI models and LLM-powered features.
Related: LLM06: Excessive Agency, LLM02: Insecure Output Handling
Related: ASI01: Excessive Agency, ASI03: Insecure Tool/Function Calling, ASI09: Inadequate Sandboxing
Related: LLM03: Training Data Poisoning, ML02: Data Poisoning Attack, ML06: AI Supply Chain Attacks
Security check items specific to code that integrates LLMs, AI agents, and ML models.
| Comprobar artículo | Importancia | Explicación |
|---|---|---|
| System prompts are not exposed in client-side code or API responses | Requerido | Prompt leakage enables targeted prompt injection attacks |
| LLM outputs are validated before rendering (HTML/JS/SQL) | Requerido | LLM-generated content may contain XSS payloads or injection vectors |
| User input and system instructions are clearly separated in prompts | Requerido | Prevents direct prompt injection by maintaining instruction-data boundary |
| Tool/function call permissions are scoped per user role | Requerido | Prevent privilege escalation through agent tool access |
| Token count limits are enforced per request and per session | Recomendado | Prevents cost explosion and denial-of-wallet attacks |
| RAG retrieval results are sanitized before insertion into prompts | Requerido | Retrieved documents may contain indirect prompt injection payloads |
| Agent actions and tool calls are logged with full audit trail | Recomendado | Essential for incident investigation and compliance in AI systems |
Policy templates for organizations deploying AI models and LLM-powered applications.
■ Model Access Tiers - Tier 1 (Restricted): GPT-4 class / fine-tuned models — requires team lead approval - Tier 2 (Standard): GPT-3.5 class / embeddings — available to all developers - Tier 3 (Open): Open-source models (local inference) — no approval required ■ API Key Management for LLM Providers - One API key per service/environment (never share across projects) - Monthly spend alerts at 50%, 80%, 100% of budget - Hard spending caps enforced at the provider level - Key rotation: every 90 days or immediately upon team member departure ■ Data Sent to External Models - NEVER send: PII, credentials, internal IP, source code, customer data - ALLOWED with review: anonymized logs, public documentation, synthetic data - All prompts to external APIs must be logged (excluding PII)
■ Training Data Requirements - All training data must have documented provenance and licensing - PII must be removed or anonymized before use in training/fine-tuning - Data poisoning checks: validate data integrity with hash verification - Retain training data snapshots for reproducibility and audit ■ RAG (Retrieval-Augmented Generation) Data - Document ingestion pipeline must sanitize content (strip scripts, injections) - Access control on vector store must mirror source document permissions - Embedding models must be versioned and pinned ■ Model Output Data - LLM outputs must not be trusted as authoritative — always verify facts - Generated code must pass the same security review as human-written code - Outputs containing PII must be flagged and redacted before storage
■ Severity Levels for AI-Specific Incidents - P1 (Critical): Prompt injection leading to data exfiltration or unauthorized actions - P1 (Critical): Model serving compromised or returning manipulated outputs - P2 (High): Training data poisoning detected, jailbreak bypass discovered - P2 (High): Agent performing unintended actions outside approved scope - P3 (Medium): Model drift causing degraded accuracy below threshold - P4 (Low): Cost overrun due to excessive token usage ■ Response Procedures - P1: Immediately disable affected model endpoint, notify security team - P2: Quarantine affected model version, roll back to last known good - P3: Trigger retraining pipeline, increase monitoring frequency - P4: Adjust rate limits and budget caps, review usage patterns ■ Post-Incident Requirements - Root cause analysis within 48 hours for P1/P2 - Update prompt injection test suite with new attack vectors - Review and update guardrails configuration
Códigos de estado HTTP relacionados con la seguridad utilizados en el diseño de API.
| Código | Significado | Caso práctico |
|---|---|---|
| 400 | Bad Request | Error de validación de entrada |
| 401 | Unauthorized | Se requiere autenticación o el token no es válido |
| 403 | Forbidden | Autentificado pero permisos insuficientes |
| 404 | Not Found | El recurso no existe (también puede utilizarse en lugar de 403) |
| 405 | Method Not Allowed | Método HTTP no permitido |
| 413 | Payload Too Large | Se ha superado el tamaño del cuerpo solicitado |
| 422 | Unprocessable Entity | Sintaxis correcta pero error semántico |
| 429 | Too Many Requests | Límite de velocidad superado |
| 500 | Internal Server Error | Error interno del servidor (ocultar detalles) |