owasp top 10 code reviewvulnerabilidades owaspseguridad aplicaciones web

OWASP Top 10: cómo detectar cada vulnerabilidad con Code Review

Guía completa para detectar las 10 vulnerabilidades críticas del OWASP Top 10 durante el code review, con ejemplos prácticos y soluciones de seguridad.

29 de marzo de 2026·8 min de lectura

¿Qué es OWASP Top 10 y por qué es crítico para tu code review?

El OWASP Top 10 es una lista actualizada periódicamente por la Open Web Application Security Project que identifica las vulnerabilidades de seguridad más críticas en aplicaciones web. Para cualquier equipo de desarrollo, conocer estas vulnerabilidades y detectarlas durante el code review es fundamental para construir software seguro.

En este artículo, desglosaremos cada una de las vulnerabilidades del OWASP Top 10 y te mostraremos cómo identificarlas durante la revisión de código, con ejemplos prácticos que podrás aplicar inmediatamente en tu flujo de trabajo.

Las 10 vulnerabilidades críticas y cómo detectarlas en code review

1. Broken Access Control (Control de Acceso Roto)

Esta vulnerabilidad ocurre cuando los usuarios pueden acceder a recursos o realizar acciones fuera de sus permisos autorizados.

Qué buscar en code review:

  • Falta de validación de permisos en endpoints
  • Referencias directas a objetos sin verificación
  • Bypass de controles mediante manipulación de parámetros

Ejemplo vulnerable:

// ❌ Vulnerable: No verifica si el usuario puede acceder a este documento
app.get('/api/documents/:id', async (req, res) => {
  const document = await Document.findById(req.params.id);
  res.json(document);
});

Ejemplo seguro:

// ✅ Seguro: Verifica permisos antes de devolver el documento
app.get('/api/documents/:id', async (req, res) => {
  const document = await Document.findById(req.params.id);
  
  if (!document || document.ownerId !== req.user.id) {
    return res.status(403).json({ error: 'Acceso denegado' });
  }
  
  res.json(document);
});

2. Cryptographic Failures (Fallos Criptográficos)

Anteriormente conocido como "Sensitive Data Exposure", se refiere al manejo inadecuado de datos sensibles y fallas en la implementación criptográfica.

Qué buscar en code review:

  • Transmisión de datos sensibles sin encriptación
  • Uso de algoritmos de hash débiles (MD5, SHA1)
  • Almacenamiento de contraseñas en texto plano
  • Claves de encriptación hardcodeadas

Ejemplo vulnerable:

# ❌ Vulnerable: Contraseñas hasheadas con MD5
import hashlib

def save_user(username, password):
    hashed = hashlib.md5(password.encode()).hexdigest()
    db.save({'username': username, 'password': hashed})

Ejemplo seguro:

# ✅ Seguro: Uso de bcrypt con salt
import bcrypt

def save_user(username, password):
    salt = bcrypt.gensalt(rounds=12)
    hashed = bcrypt.hashpw(password.encode(), salt)
    db.save({'username': username, 'password': hashed})

3. Injection (Inyección)

Las vulnerabilidades de inyección permiten a atacantes enviar datos maliciosos que se ejecutan como comandos o consultas.

Qué buscar en code review:

  • Concatenación de strings en queries SQL
  • Uso de eval() o exec() con input del usuario
  • Comandos del sistema construidos con input no sanitizado
  • Queries NoSQL vulnerables

Ejemplo vulnerable:

// ❌ Vulnerable: SQL Injection
$userId = $_GET['id'];
$query = "SELECT * FROM users WHERE id = " . $userId;
$result = mysqli_query($conn, $query);

Ejemplo seguro:

// ✅ Seguro: Prepared statements
$userId = $_GET['id'];
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();

4. Insecure Design (Diseño Inseguro)

Esta categoría se centra en fallas en la fase de diseño y arquitectura, no solo en errores de implementación.

Qué buscar en code review:

  • Ausencia de rate limiting en endpoints críticos
  • Falta de segregación de ambientes
  • No implementación de principio de mínimo privilegio
  • Ausencia de controles de límites de recursos

Ejemplo de mejora:

// ✅ Implementación de rate limiting
const rateLimit = require('express-rate-limit');

const loginLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 5, // máximo 5 intentos
  message: 'Demasiados intentos de login, intenta más tarde'
});

app.post('/api/login', loginLimiter, async (req, res) => {
  // Lógica de login
});

5. Security Misconfiguration (Configuración de Seguridad Incorrecta)

Configuraciones predeterminadas inseguras, configuraciones incompletas o mensajes de error demasiado verbosos.

Qué buscar en code review:

  • Credenciales por defecto en código
  • Stack traces expuestos en producción
  • Servicios innecesarios habilitados
  • Headers de seguridad faltantes

Ejemplo de configuración segura:

// ✅ Headers de seguridad configurados correctamente
const helmet = require('helmet');

app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'unsafe-inline'"]
    }
  },
  hsts: {
    maxAge: 31536000,
    includeSubDomains: true
  }
}));

// No exponer stack traces en producción
app.use((err, req, res, next) => {
  if (process.env.NODE_ENV === 'production') {
    res.status(500).json({ error: 'Error interno del servidor' });
  } else {
    res.status(500).json({ error: err.message, stack: err.stack });
  }
});

6. Vulnerable and Outdated Components (Componentes Vulnerables y Desactualizados)

Uso de librerías, frameworks o dependencias con vulnerabilidades conocidas.

Qué buscar en code review:

  • Dependencias sin actualizar en package.json, requirements.txt, etc.
  • Uso de versiones con CVEs conocidos
  • Falta de auditorías de seguridad regulares

Checklist de revisión:

ElementoQué revisar
package.json / pom.xmlVersiones específicas vs rangos amplios (^, ~)
LockfilesPresencia de package-lock.json, yarn.lock
DependenciasEjecutar `npm audit` o equivalente
CI/CDAutomatización de checks de seguridad

7. Identification and Authentication Failures (Fallas de Identificación y Autenticación)

Problemas con la gestión de sesiones, autenticación débil o compromiso de credenciales.

Qué buscar en code review:

  • Ausencia de autenticación multifactor
  • Tokens de sesión predecibles
  • Timeout de sesión inexistente
  • Recuperación de contraseñas insegura

Ejemplo vulnerable:

// ❌ Vulnerable: Token de sesión predecible
function generateSessionToken(userId) {
  return `session_${userId}_${Date.now()}`;
}

Ejemplo seguro:

// ✅ Seguro: Token criptográficamente aleatorio
const crypto = require('crypto');

function generateSessionToken() {
  return crypto.randomBytes(32).toString('hex');
}

8. Software and Data Integrity Failures (Fallas de Integridad)

Código o infraestructura que no protege contra violaciones de integridad, como plugins o librerías no verificadas.

Qué buscar en code review:

  • Descargas de CDNs sin Subresource Integrity (SRI)
  • Despliegues sin firma digital
  • Deserialización insegura de datos
  • Auto-updates sin verificación

Ejemplo seguro:

<!-- ✅ Uso de SRI para verificar integridad -->
<script 
  src="https://cdn.example.com/library.js"
  integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/ux..."
  crossorigin="anonymous">
</script>

9. Security Logging and Monitoring Failures (Fallas en Logging y Monitoreo)

Insuficiente logging de eventos de seguridad o falta de monitoreo activo.

Qué buscar en code review:

  • Ausencia de logs en operaciones críticas
  • Logs que exponen información sensible
  • Falta de alertas para eventos sospechosos
  • Logs sin protección contra manipulación

Ejemplo de logging apropiado:

# ✅ Logging de seguridad apropiado
import logging
from datetime import datetime

security_logger = logging.getLogger('security')

def login_attempt(username, success, ip_address):
    security_logger.info({
        'event': 'login_attempt',
        'username': username,  # No incluir password
        'success': success,
        'ip': ip_address,
        'timestamp': datetime.utcnow().isoformat()
    })
    
    if not success:
        # Alertar después de múltiples fallos
        check_brute_force_attempt(username, ip_address)

10. Server-Side Request Forgery (SSRF)

Ocurre cuando una aplicación web obtiene recursos remotos sin validar la URL proporcionada por el usuario.

Qué buscar en code review:

  • Fetch/requests a URLs controladas por usuario
  • Falta de whitelist de dominios permitidos
  • Acceso a recursos internos sin validación

Ejemplo vulnerable:

# ❌ Vulnerable: SSRF
import requests

@app.route('/fetch')
def fetch_url():
    url = request.args.get('url')
    response = requests.get(url)
    return response.content

Ejemplo seguro:

# ✅ Seguro: Validación de URL con whitelist
import requests
from urllib.parse import urlparse

ALLOWED_DOMAINS = ['api.example.com', 'cdn.example.com']

@app.route('/fetch')
def fetch_url():
    url = request.args.get('url')
    parsed = urlparse(url)
    
    if parsed.hostname not in ALLOWED_DOMAINS:
        return 'Dominio no permitido', 403
    
    if parsed.hostname in ['localhost', '127.0.0.1'] or parsed.hostname.startswith('192.168.'):
        return 'Acceso a recursos internos bloqueado', 403
    
    response = requests.get(url, timeout=5)
    return response.content

Automatizando la detección de vulnerabilidades OWASP con CodeReview AI

Detectar estas vulnerabilidades manualmente en cada code review puede ser tedioso y propenso a errores humanos. CodeReview AI analiza automáticamente tu código en busca de las vulnerabilidades del OWASP Top 10, proporcionando feedback instantáneo antes de que el código llegue a producción.

La herramienta no solo identifica el problema, sino que sugiere la solución específica para tu contexto, acelerando el proceso de aprendizaje del equipo y mejorando la postura de seguridad de tus aplicaciones.

Checklist definitivo para code review enfocado en OWASP Top 10

Utiliza esta checklist en cada revisión de código:

  • [ ] Control de acceso: ¿Se verifican permisos en todos los endpoints?
  • [ ] Criptografía: ¿Se usan algoritmos modernos y seguros?
  • [ ] Inyección: ¿Se sanitizan todas las entradas del usuario?
  • [ ] Diseño: ¿Hay rate limiting y controles de recursos?
  • [ ] Configuración: ¿Headers de seguridad configurados?
  • [ ] Dependencias: ¿Todas las librerías están actualizadas?
  • [ ] Autenticación: ¿Tokens seguros y timeout de sesión?
  • [ ] Integridad: ¿Se verifica la integridad de recursos externos?
  • [ ] Logging: ¿Eventos de seguridad registrados apropiadamente?
  • [ ] SSRF: ¿URLs validadas con whitelist?

Conclusión: Integra seguridad en tu flujo de desarrollo

El OWASP Top 10 no es solo una lista de verificación, sino una guía fundamental para construir aplicaciones seguras desde el inicio. Integrar estas revisiones en tu proceso de code review garantiza que la seguridad sea una prioridad, no una idea tardía.

CodeReview AI puede convertirse en tu aliado automatizado para detectar estas vulnerabilidades en tiempo real, permitiendo que tu equipo se concentre en resolver problemas en lugar de buscarlos manualmente.

¿Listo para mejorar la seguridad de tu código?

Comienza a detectar automáticamente vulnerabilidades del OWASP Top 10 en tus pull requests. Prueba CodeReview AI gratis y protege tus aplicaciones desde el primer commit.

📬

Tips de code review cada semana

Vulnerabilidades reales, buenas prácticas y trucos de seguridad. Sin spam. Cancela cuando quieras.

Prueba CodeReview AI gratis

Analiza tu código con IA en segundos. 10 reviews gratuitos, sin tarjeta de crédito.

Empezar gratis →