Estándar de Codificación Segura
Estándares para la codificación segura de aplicaciones.
Quieres aprender más?
Descarga el Kit de Ciberseguridad.
📋 Información General
Documento: Estándar de Codificación Segura
Versión: 1.0.0
Fecha: Enero 2025
Clasificación: Confidencial
Audiencia: Desarrolladores, arquitectos de software y equipos de QA de DivisionCero
🎯 Propósito
Definir los estándares técnicos y mejores prácticas de codificación segura que deben seguir todos los desarrolladores de DivisionCero para prevenir vulnerabilidades de seguridad comunes y garantizar que el código sea resistente a ataques. Este estándar complementa la Política de Desarrollo Seguro estableciendo requisitos técnicos específicos.
🏢 Alcance
Este estándar aplica a:
- Todo el código fuente desarrollado para la plataforma SaaS de DivisionCero
- Aplicaciones web, APIs REST/GraphQL, microservicios y componentes backend
- Código frontend incluyendo aplicaciones SPA y componentes JavaScript
- Scripts de automatización, infraestructura como código (IaC) y configuraciones
- Bibliotecas internas y componentes reutilizables
- Integraciones con servicios externos y APIs de terceros
📚 Definiciones
- Inyección de Código: Vulnerabilidad que permite ejecutar código malicioso en el sistema
- XSS: Cross-Site Scripting - Inyección de scripts en aplicaciones web
- CSRF: Cross-Site Request Forgery - Ataques que explotan la confianza de un sitio
- IDOR: Insecure Direct Object Reference - Acceso no autorizado a objetos
- Sanitización: Proceso de limpieza y validación de datos de entrada
- Principio de Menor Privilegio: Otorgar solo los permisos mínimos necesarios
- Secrets: Información sensible como claves API, tokens y credenciales
🛡️ Política
Validación y Sanitización de Entrada
Validación de Datos
- Validación del lado servidor: Toda validación crítica debe realizarse en el backend
- Lista blanca sobre lista negra: Definir qué está permitido en lugar de qué está prohibido
- Validación de tipo de dato: Verificar tipos, rangos y formatos esperados
- Encoding de salida: Codificar datos antes de mostrarlos al usuario
// ✅ Correcto: Validación robusta
function validateEmail(email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!email || typeof email !== 'string') {
throw new Error('Email inválido');
}
return emailRegex.test(email.trim());
}
// ❌ Incorrecto: Sin validación
function processEmail(email) {
return email; // Vulnerable a inyección
}
Prevención de Inyección SQL
- Consultas parametrizadas: Usar siempre prepared statements
- ORM seguro: Utilizar ORMs que manejen sanitización automática
- Validación de entrada: Nunca construir queries con concatenación de strings
-- ✅ Correcto: Query parametrizada
SELECT * FROM users WHERE email = ? AND status = ?
-- ❌ Incorrecto: Concatenación directa
SELECT * FROM users WHERE email = '" + userEmail + "'
Gestión de Autenticación y Sesiones
Autenticación Robusta
- Hashing de contraseñas: Usar bcrypt, scrypt o Argon2 con salt apropiado
- Múltiples factores: Implementar 2FA/MFA para cuentas privilegiadas
- Bloqueo por intentos: Limitar intentos de login fallidos
- Tokens seguros: Usar JWT con algoritmos seguros (RS256, no HS256 con secrets débiles)
// ✅ Correcto: Hashing seguro
const bcrypt = require('bcrypt');
const saltRounds = 12;
async function hashPassword(password) {
return await bcrypt.hash(password, saltRounds);
}
// ❌ Incorrecto: Almacenamiento en texto plano
function storePassword(password) {
return password; // Nunca almacenar contraseñas en texto plano
}
Gestión de Sesiones
- Tokens de sesión seguros: Generar tokens criptográficamente seguros
- Expiración apropiada: Configurar timeouts de sesión razonables
- Invalidación: Implementar logout que invalide completamente la sesión
- Rotación de tokens: Renovar tokens periódicamente
Manejo de Errores y Logging
Manejo Seguro de Errores
- Información mínima: No exponer detalles internos en mensajes de error
- Logging completo: Registrar errores detalladamente para debugging interno
- Códigos de estado apropiados: Usar códigos HTTP correctos sin revelar arquitectura
// ✅ Correcto: Error handling seguro
try {
await processPayment(paymentData);
} catch (error) {
logger.error('Payment processing failed', {
userId: user.id,
error: error.message,
timestamp: new Date().toISOString()
});
// Usuario solo ve mensaje genérico
res.status(500).json({
error: 'Error procesando el pago. Intente nuevamente.'
});
}
// ❌ Incorrecto: Exposición de información interna
catch (error) {
res.status(500).json({ error: error.stack }); // Revela arquitectura
}
Comunicaciones Seguras
Encriptación en Tránsito
- HTTPS obligatorio: Todas las comunicaciones deben usar TLS 1.2+
- HSTS headers: Implementar HTTP Strict Transport Security
- Certificate pinning: Para conexiones críticas con APIs externas
Encriptación en Reposo
- Datos sensibles: Encriptar PII, tokens y secretos en base de datos
- Claves de encriptación: Usar servicios de gestión de claves (AWS KMS, HashiCorp Vault)
- Rotación de claves: Implementar rotación automática de claves de encriptación
Gestión de Secretos y Configuración
Secretos y Credenciales
- Variables de entorno: Nunca hardcodear secretos en el código
- Vaults de secretos: Usar soluciones especializadas para gestión de secretos
- Rotación automática: Implementar rotación automática de API keys y tokens
- Principio de menor privilegio: Cada servicio solo debe tener acceso a sus secretos necesarios
// ✅ Correcto: Uso de variables de entorno
const dbPassword = process.env.DB_PASSWORD;
const apiKey = process.env.EXTERNAL_API_KEY;
// ❌ Incorrecto: Secretos hardcodeados
const dbPassword = "mySecretPassword123"; // Nunca hacer esto
const apiKey = "sk-1234567890abcdef"; // Vulnerable
Control de Acceso y Autorización
Implementación de RBAC
- Verificación en cada endpoint: Validar permisos en todas las rutas protegidas
- Contexto de autorización: Considerar contexto del usuario y recurso solicitado
- Principio de menor privilegio: Otorgar solo permisos mínimos necesarios
// ✅ Correcto: Verificación de autorización
async function updateUser(userId, userData, currentUser) {
// Verificar que el usuario puede modificar este recurso
if (currentUser.id !== userId && !currentUser.hasRole('admin')) {
throw new ForbiddenError('No autorizado para modificar este usuario');
}
return await userService.update(userId, userData);
}
Seguridad Frontend
Prevención XSS
- Content Security Policy: Implementar CSP headers restrictivos
- Sanitización de HTML: Usar bibliotecas como DOMPurify para contenido dinámico
- Escapado de caracteres: Escapar datos antes de insertar en DOM
Protección CSRF
- Tokens CSRF: Implementar tokens anti-CSRF en formularios
- SameSite cookies: Configurar cookies con atributo SameSite
- Verificación de origen: Validar headers Origin y Referer
Análisis y Testing de Seguridad
Herramientas Obligatorias
- SAST: Análisis estático integrado en CI/CD (SonarQube, Checkmarx)
- Dependency checking: Escaneo de vulnerabilidades en dependencias (Snyk, OWASP Dependency Check)
- Secret scanning: Detección de secretos hardcodeados (GitLeaks, TruffleHog)
Métricas de Calidad
- Cobertura de código: Mínimo 80% cobertura con tests de seguridad incluidos
- Complejidad ciclomática: Mantener funciones con complejidad < 10
- Deuda técnica: Remediar vulnerabilidades según SLA establecido
👥 Roles y Responsabilidades
- Desarrolladores Senior: Mentorear en prácticas de codificación segura
- Arquitectos de Software: Definir patrones y bibliotecas seguras
- Tech Leads: Asegurar cumplimiento en revisiones de código
- Security Champions: Promover adopción de estándares en equipos
- DevOps Engineers: Configurar herramientas de análisis automático
- QA Engineers: Validar implementación de controles de seguridad
📊 Cumplimiento y Medición
Métricas de Cumplimiento
- Porcentaje de código que pasa análisis SAST sin vulnerabilidades críticas/altas
- Tiempo promedio de remediación de vulnerabilidades por severidad
- Número de vulnerabilidades detectadas en producción vs. desarrollo
- Cobertura de pruebas de seguridad en suite de testing
Auditorías
- Revisión mensual de métricas de calidad de código
- Auditorías trimestrales de cumplimiento de estándares
- Evaluación anual de efectividad de controles implementados
🚨 Incumplimiento
El incumplimiento de este estándar puede resultar en:
- Rechazo automático de pull requests que no cumplan criterios
- Reentrenamiento obligatorio en prácticas de codificación segura
- Revisión adicional de todo el código del desarrollador
- Escalamiento a management para casos recurrentes
- Revocación temporal de privilegios de commit para violaciones graves
📖 Referencias
- OWASP Top 10 Web Application Security Risks
- OWASP Secure Coding Practices Quick Reference
- CWE/SANS Top 25 Most Dangerous Software Errors
- NIST SP 800-218 Secure Software Development Framework
- ISO 27034 Application Security Management
- Mozilla Web Security Guidelines
- Google Web Fundamentals - Security
📝 Control de Versiones
Versión | Fecha | Cambios | Autor |
---|---|---|---|
1.0.0 | Enero 2025 | Versión inicial del estándar | Equipo GRC |
¿Te ha resultado útil esta página?
Última modificación: 25 de agosto de 2025