Cómo hacer Code Review de seguridad: checklist completo
Guía completa con checklist para hacer code reviews de seguridad efectivos. Aprende a detectar vulnerabilidades, ejemplos de código y mejores prácticas.
¿Por qué la seguridad debe ser prioridad en tus code reviews?
La seguridad del software no es un "extra" que añadimos al final del desarrollo. Cada vez que se introduce código nuevo en tu proyecto, se abre una potencial puerta a vulnerabilidades que podrían comprometer datos sensibles, afectar la disponibilidad del sistema o permitir accesos no autorizados.
Un code review enfocado en seguridad es tu primera línea de defensa. Según estudios de la industria, detectar y corregir un bug de seguridad durante la fase de desarrollo cuesta hasta 30 veces menos que hacerlo en producción. Por eso, integrar prácticas de seguridad en tus revisiones de código no solo protege tu aplicación, sino que también ahorra tiempo y recursos.
Checklist completo para code review de seguridad
1. Validación y sanitización de inputs
¿Qué revisar?
- •Toda entrada de usuario debe ser validada
- •Los datos deben sanitizarse antes de procesarse
- •Implementar listas blancas en lugar de listas negras cuando sea posible
Ejemplo vulnerable:
// ❌ MALO: SQL Injection vulnerable
app.get('/user', (req, res) => {
const userId = req.query.id;
const query = `SELECT * FROM users WHERE id = ${userId}`;
db.query(query, (err, results) => {
res.json(results);
});
});Ejemplo seguro:
// ✅ BUENO: Usando prepared statements
app.get('/user', (req, res) => {
const userId = parseInt(req.query.id, 10);
if (isNaN(userId) || userId <= 0) {
return res.status(400).json({ error: 'Invalid user ID' });
}
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId], (err, results) => {
res.json(results);
});
});2. Autenticación y autorización
Puntos clave a verificar:
| Aspecto | Qué revisar |
|---|---|
| Contraseñas | ¿Se almacenan hasheadas con algoritmos modernos (bcrypt, Argon2)? |
| Tokens | ¿Los JWT tienen expiración? ¿Se validan correctamente? |
| Sesiones | ¿Se invalidan al cerrar sesión? ¿Timeout apropiado? |
| Permisos | ¿Se verifica autorización en cada endpoint? |
| MFA | ¿Está implementada para cuentas privilegiadas? |
Ejemplo de verificación de autorización:
# ❌ MALO: Solo verifica autenticación
@app.route('/admin/delete-user/<user_id>', methods=['DELETE'])
@login_required
def delete_user(user_id):
user = User.query.get(user_id)
db.session.delete(user)
db.session.commit()
return jsonify({'success': True})
# ✅ BUENO: Verifica autenticación Y autorización
@app.route('/admin/delete-user/<user_id>', methods=['DELETE'])
@login_required
@require_role('admin')
def delete_user(user_id):
if current_user.id == user_id:
return jsonify({'error': 'Cannot delete yourself'}), 403
user = User.query.get_or_404(user_id)
db.session.delete(user)
db.session.commit()
return jsonify({'success': True})3. Gestión de secretos y credenciales
Durante el code review de seguridad, verifica que:
- •No haya credenciales hardcodeadas en el código
- •Las API keys estén en variables de entorno
- •Los archivos de configuración sensibles estén en
.gitignore - •Se utilicen servicios de gestión de secretos (AWS Secrets Manager, HashiCorp Vault)
// ❌ MALO: Credenciales expuestas
const config = {
database: {
host: 'prod-db.company.com',
user: 'admin',
password: 'SuperSecret123!'
}
};
// ✅ BUENO: Usando variables de entorno
const config = {
database: {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD
}
};4. Manejo seguro de datos sensibles
Checklist específico:
- •[ ] Los datos sensibles se cifran en tránsito (HTTPS/TLS)
- •[ ] Los datos sensibles se cifran en reposo
- •[ ] No se registran datos sensibles en logs
- •[ ] Se implementa enmascaramiento de datos cuando es necesario
- •[ ] Cumplimiento con regulaciones (GDPR, CCPA, etc.)
// ❌ MALO: Logueando información sensible
logger.info("User login attempt: " + username + " with password: " + password);
// ✅ BUENO: Sin exponer información sensible
logger.info("User login attempt for user: " + username);5. Protección contra vulnerabilidades comunes (OWASP Top 10)
Herramientas como CodeReview AI pueden ayudarte a detectar automáticamente muchas de estas vulnerabilidades, pero es importante entender qué buscar:
Cross-Site Scripting (XSS)
// ❌ MALO: XSS vulnerable
document.getElementById('welcome').innerHTML =
'Welcome ' + userName;
// ✅ BUENO: Escapando contenido
document.getElementById('welcome').textContent =
'Welcome ' + userName;
// O usando frameworks con auto-escapeCross-Site Request Forgery (CSRF)
# ✅ Verificar que se implementen tokens CSRF
@app.route('/transfer', methods=['POST'])
@csrf_protect
def transfer_money():
# Procesar transferencia
passInyección de comandos
# ❌ MALO: Command injection vulnerable
import os
filename = request.args.get('file')
os.system(f'cat {filename}')
# ✅ BUENO: Usando APIs seguras
import subprocess
filename = request.args.get('file')
# Validar filename primero
if not re.match(r'^[a-zA-Z0-9_\-\.]+$', filename):
abort(400)
result = subprocess.run(['cat', filename], capture_output=True)6. Configuración y dependencias
Aspectos a revisar:
- •[ ] Dependencias actualizadas sin vulnerabilidades conocidas
- •[ ] Configuraciones de seguridad apropiadas (headers HTTP)
- •[ ] Desactivación de funcionalidades de debug en producción
- •[ ] Configuración correcta de CORS
// ✅ Headers de seguridad recomendados
app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'"]
}
},
hsts: {
maxAge: 31536000,
includeSubDomains: true
}
}));7. Manejo de errores y logging
Los errores pueden revelar información valiosa a atacantes:
// ❌ MALO: Exponiendo detalles del sistema
catch (Exception $e) {
echo "Error: " . $e->getMessage();
echo "Stack trace: " . $e->getTraceAsString();
}
// ✅ BUENO: Mensaje genérico al usuario
catch (Exception $e) {
error_log($e->getMessage()); // Log interno
http_response_code(500);
echo json_encode(['error' => 'An error occurred. Please try again later.']);
}Automatizando el proceso con herramientas especializadas
Realizar un code review de seguridad completo manualmente puede ser exhaustivo y propenso a errores humanos. Aquí es donde CodeReview AI marca la diferencia: utiliza inteligencia artificial para identificar automáticamente vulnerabilidades de seguridad, patrones inseguros y malas prácticas en tu código.
La plataforma analiza cada pull request y proporciona feedback específico sobre:
- •Vulnerabilidades de seguridad conocidas
- •Violaciones de mejores prácticas de seguridad
- •Dependencias con CVEs conocidos
- •Patrones de código inseguro
Esto permite que tus desarrolladores se enfoquen en revisar la lógica de negocio mientras la herramienta se encarga de la detección automática de problemas de seguridad.
Implementando el checklist en tu equipo
Crea una cultura de seguridad
- 1.Formación continua: Organiza sesiones regulares sobre seguridad
- 2.Documentación: Mantén guías de seguridad específicas de tu stack
- 3.Templates: Usa plantillas de PR que incluyan consideraciones de seguridad
- 4.Métricas: Mide y comunica mejoras en seguridad
Integra seguridad en tu workflow
- •Ejecuta análisis estáticos de seguridad (SAST) en cada commit
- •Implementa análisis de dependencias automático
- •Configura gates de seguridad antes de merge a main
- •Realiza pruebas de penetración periódicas
Conclusión: La seguridad es responsabilidad de todos
Un code review de seguridad efectivo no es un proceso puntual, sino un hábito continuo que debe integrarse en tu cultura de desarrollo. Este checklist te proporciona una base sólida para empezar a revisar código con un enfoque de seguridad primero.
Recuerda que las herramientas automatizadas como CodeReview AI no reemplazan el criterio humano, pero sí amplifican tu capacidad de detectar problemas y permiten que tu equipo se enfoque en aspectos más estratégicos de la seguridad.
¿Listo para mejorar la seguridad de tu código?
Empieza hoy mismo a implementar code reviews de seguridad automatizados con CodeReview AI. Obtén feedback instantáneo sobre vulnerabilidades y mejora la calidad de tu código desde el primer commit.
#e6edf3] font-semibold">[Regístrate gratis en CodeReview AI y recibe tu primer análisis de seguridad en minutos.
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 →