Saltar al contenido principal

Formación en seguridad para desarrolladores: currículo y recursos

Los desarrolladores escriben el código que los atacantes explotan. Cada inyección SQL, cada vulnerabilidad XSS, cada evasión de autenticación existe porque un desarrollador escribió el código de esa manera. No es una culpa: es la realidad. Y la solución no son los equipos de seguridad revisando cada línea de código. Son los desarrolladores que entienden la seguridad y la integran desde el inicio.

Los desarrolladores con conciencia de seguridad no solo evitan vulnerabilidades. Piensan como atacantes. Cuestionan las suposiciones. Se preguntan «¿qué podría salir mal?» antes de lanzar. Construyen defensa en profundidad, no seguridad como una ocurrencia tardía.

Este artículo proporciona un currículo integral de formación en seguridad para desarrolladores: qué temas cubrir, recursos de aprendizaje para cada uno y rutas de aprendizaje estructuradas desde el nivel junior hasta el senior.

Serie de tres partes

Esta es la Parte 1 de la serie de formación en seguridad para desarrolladores:

  1. Currículo y recursos (este artículo) — qué enseñar
  2. Evaluación y mapeo de competencias — cómo evaluar las habilidades
  3. Guía de implementación — cómo desplegar el programa

Por qué importa la formación en seguridad para desarrolladores

La economía es clara: corregir una vulnerabilidad durante el desarrollo cuesta 6 veces menos que corregirla en producción. Encontrarla durante el diseño cuesta 15 veces menos que después del lanzamiento. El conocimiento de seguridad del desarrollador es la inversión de seguridad más rentable que puede hacer.

La mayoría de las vulnerabilidades son prevenibles. El OWASP Top 10 no ha cambiado drásticamente en 20 años. La inyección SQL, el XSS, el control de acceso roto: sabemos que estas vulnerabilidades existen. Sabemos cómo prevenirlas. Sin embargo, siguen apareciendo en código nuevo porque los desarrolladores no aprenden a evitarlas.

Los equipos de seguridad no pueden escalar. Incluso si tiene especialistas en seguridad, no pueden revisar cada commit. La proporción entre desarrolladores e ingenieros de seguridad suele ser de 100:1 o peor. Los desarrolladores deben ser la primera línea de defensa.

Shift-left requiere conocimiento del desarrollador. DevSecOps significa integrar la seguridad en el desarrollo. Pero los desarrolladores no pueden corregir los hallazgos de SAST que no entienden. No pueden modelar amenazas de las funcionalidades que están construyendo sin conocimiento de seguridad.

Es un diferenciador de carrera. Los desarrolladores con habilidades de seguridad tienen alta demanda. El conocimiento de seguridad aumenta el potencial de ingresos y abre caminos hacia roles especializados (Application Security, Security Engineering).

Marco de competencias en seguridad

Antes de formar a los desarrolladores, defina qué significa «competencia en seguridad» para su organización. Aquí tiene un marco:

Niveles de competencia

NivelNombreDescripciónEsperado de
L1ConscienteEntiende los conceptos básicos de seguridad, reconoce vulnerabilidades comunesTodos los desarrolladores
L2PracticanteEscribe código seguro de forma consistente, puede revisar el código de otros en busca de seguridadDesarrolladores senior
L3ExpertoDiseña sistemas seguros, guía a otros, lidera iniciativas de seguridadTech leads, arquitectos
L4CampeónImpulsa la cultura de seguridad, representa al equipo en debates de seguridadSecurity Champions

Áreas de competencia

ÁreaL1: ConscienteL2: PracticanteL3: Experto
Codificación seguraConoce el OWASP Top 10Previene vulnerabilidades en su propio códigoRevisa el código de otros, crea patrones
Autenticación y autorizaciónEntiende los conceptosImplementa correctamenteDiseña sistemas de autenticación
Protección de datosConoce la clasificaciónManeja los datos de forma seguraDiseña estrategias de protección de datos
Modelado de amenazasEntiende el propósitoParticipa en sesionesLidera el modelado de amenazas
Pruebas de seguridadEjecuta herramientas proporcionadasEscribe pruebas de seguridadCrea estrategias de pruebas
Respuesta a incidentesReporta problemasInvestiga y corrigeLidera la respuesta a incidentes
DependenciasActualiza cuando se le indicaMonitorea y gestionaCrea políticas de dependencias

Requisitos por rol

RolNivel mínimoÁreas de enfoque
Desarrollador juniorL1Conceptos básicos de codificación segura, OWASP Top 10
Desarrollador de nivel medioL1-L2Codificación segura, pruebas básicas de seguridad
Desarrollador seniorL2Todas las áreas, revisión de código, mentoría
Tech LeadL2-L3Arquitectura, modelado de amenazas, prácticas del equipo
Ingeniero de QAL1-L2Pruebas de seguridad, verificación de vulnerabilidades
Ingeniero de DevOpsL2Seguridad de infraestructura, seguridad de CI/CD
Security ChampionL3-L4Todas las áreas, liderazgo cultural

Currículo principal para desarrolladores

1: Fundamentos de seguridad

Duración: 2-4 horas
Destinatario: Todos los desarrolladores (L1)

Temas:

  • Tríada CIA (Confidencialidad, Integridad, Disponibilidad)
  • Defensa en profundidad
  • Principio de mínimo privilegio
  • Concepto de superficie de ataque
  • Equilibrio entre seguridad y comodidad
  • Panorama de amenazas para aplicaciones web

Objetivos de aprendizaje:

  • Explicar por qué la seguridad importa para los desarrolladores
  • Identificar vectores de ataque comunes
  • Comprender la terminología básica de seguridad
  • Reconocer cuándo pedir ayuda de seguridad

Recursos:

RecursoTipoCosteEnlace
OWASP Web Security Testing GuideGuíaGratuitoowasp.org/www-project-web-security-testing-guide
PortSwigger Web Security AcademyCurso interactivoGratuitoportswigger.net/web-security
Hack The Box AcademyLaboratorios prácticosNivel gratuitoacademy.hackthebox.com
TryHackMeLaboratorios para principiantesNivel gratuitotryhackme.com

2: Análisis profundo del OWASP Top 10

Duración: 4-8 horas
Destinatario: Todos los desarrolladores (L1-L2)

El OWASP Top 10 representa los riesgos de seguridad más críticos para las aplicaciones web. Cada desarrollador debe entender estas vulnerabilidades en profundidad.

OWASP Top 10 (2021):

#VulnerabilidadQué esPrevención
A01Control de acceso rotoLos usuarios pueden acceder a recursos no autorizadosVerificar la autorización en cada solicitud
A02Fallos criptográficosDatos sensibles expuestos mediante criptografía débilUsar cifrado fuerte, gestión adecuada de claves
A03InyecciónDatos no confiables ejecutados como códigoConsultas parametrizadas, validación de entrada
A04Diseño inseguroFallos en la arquitectura/diseñoModelado de amenazas, patrones de diseño seguros
A05Mala configuración de seguridadConfiguraciones predeterminadas, funciones innecesariasHardening, permisos mínimos
A06Componentes vulnerablesUso de componentes con vulnerabilidades conocidasEscaneo SCA, actualizaciones
A07Fallos de autenticaciónMecanismos de autenticación rotosMFA, gestión segura de sesiones
A08Fallos de integridad de software y datosConfiar en fuentes no confiablesVerificar firmas, comprobaciones de integridad
A09Fallos de registro de seguridadRegistro insuficiente para la detecciónRegistro de seguridad integral
A10SSRFEl servidor hace solicitudes a destinos controlados por el atacanteValidar y sanitizar URLs

Práctica práctica:

PlataformaDescripciónEnlace
OWASP WebGoatApp deliberadamente insegura para aprendergithub.com/WebGoat/WebGoat
OWASP Juice ShopApp vulnerable modernaowasp.org/www-project-juice-shop
DVWADamn Vulnerable Web Applicationgithub.com/digininja/DVWA
HackTheBoxMáquinas vulnerableshackthebox.com
PentesterLabEjercicios guiadospentesterlab.com

3: Codificación segura por lenguaje

Duración: 4-6 horas por lenguaje
Destinatario: Desarrolladores (L1-L2)

Las prácticas de seguridad difieren por lenguaje y framework. Proporcione formación específica por lenguaje para su stack.

JavaScript/TypeScript

Áreas clave:

  • Prevención de XSS (codificación de salida, CSP)
  • Contaminación de prototipos
  • Seguridad de dependencias npm
  • Autenticación segura con JWTs
  • Validación de solicitudes del lado del servidor
  • Análisis seguro de JSON

Recursos:

RecursoTipoEnlace
OWASP Node.js Security Cheat SheetGuíacheatsheetseries.owasp.org
Node.js Security Best PracticesGuíanodejs.org/en/docs/guides/security
Snyk JavaScript SecurityBlog/Aprendizajesnyk.io/learn/javascript-security
Secure Coding in Node.jsCursopluralsight.com

Ejemplo: Prevención de XSS

// BAD: Direct HTML insertion
element.innerHTML = userInput; // XSS vulnerability

// GOOD: Text content (auto-escapes)
element.textContent = userInput;

// GOOD: DOMPurify for rich content
import DOMPurify from 'dompurify';
element.innerHTML = DOMPurify.sanitize(userInput);

// GOOD: Template literals with encoding
const safe = encodeHTML(userInput);
element.innerHTML = `<div>${safe}</div>`;

Python

Áreas clave:

  • Inyección SQL con ORMs
  • Inyección de comandos (subprocess)
  • Deserialización de Pickle
  • SSTI (Inyección de plantillas del lado del servidor)
  • Path traversal
  • Hash seguro de contraseñas

Recursos:

RecursoTipoEnlace
OWASP Python SecurityGuíacheatsheetseries.owasp.org
BanditHerramienta SASTbandit.readthedocs.io
Real Python SecurityTutorialesrealpython.com/tutorials/security
Python Security Best PracticesCursopluralsight.com

Ejemplo: Prevención de inyección SQL

# BAD: String formatting (SQL injection)
query = f"SELECT * FROM users WHERE id = {user_id}"
cursor.execute(query)

# GOOD: Parameterized queries
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

# GOOD: ORM usage (SQLAlchemy)
user = session.query(User).filter(User.id == user_id).first()

# GOOD: Django ORM
user = User.objects.get(id=user_id)

Java

Áreas clave:

  • Inyección SQL (JDBC, JPA)
  • XML External Entity (XXE)
  • Vulnerabilidades de deserialización
  • Configuración de Spring Security
  • Registro seguro
  • Criptografía con JCA

Recursos:

RecursoTipoEnlace
OWASP Java SecurityGuíacheatsheetseries.owasp.org
Spring Security ReferenceDocumentacióndocs.spring.io/spring-security
Find Security BugsHerramienta SASTfind-sec-bugs.github.io
Secure Coding Guidelines for JavaGuía de Oracleoracle.com

Go

Áreas clave:

  • Validación de entrada
  • Inyección SQL con database/sql
  • Path traversal
  • Condiciones de carrera
  • Configuración segura del cliente HTTP
  • Criptografía con el paquete crypto

Recursos:

RecursoTipoEnlace
OWASP Go SecurityGuíacheatsheetseries.owasp.org
Secure GoLibrogithub.com/OWASP/Go-SCP
gosecHerramienta SASTgithub.com/securego/gosec

PHP

Áreas clave:

  • Inyección SQL (PDO, mysqli)
  • Prevención de XSS
  • Vulnerabilidades de carga de archivos
  • Seguridad de sesiones
  • Vulnerabilidades de include/require
  • Hash de contraseñas con password_hash()

Recursos:

RecursoTipoEnlace
OWASP PHP SecurityGuíacheatsheetseries.owasp.org
PHP: The Right Way - SecurityGuíaphptherightway.com/#security
PsalmAnalizador estáticopsalm.dev

C# / .NET

Áreas clave:

  • Inyección SQL con Entity Framework
  • XSS en vistas Razor
  • Tokens antifalsificación (CSRF)
  • Deserialización segura
  • Criptografía con APIs de .NET
  • Autenticación con ASP.NET Identity

Recursos:

RecursoTipoEnlace
OWASP .NET SecurityGuíacheatsheetseries.owasp.org
ASP.NET Core SecurityDocumentacióndocs.microsoft.com/en-us/aspnet/core/security
Security Code ScanHerramienta SASTsecurity-code-scan.github.io

4: Autenticación y autorización

Duración: 4-6 horas
Destinatario: Desarrolladores (L2)

Temas:

  • Autenticación vs. autorización
  • Gestión de sesiones
  • Buenas prácticas y problemas de JWT
  • OAuth 2.0 y OpenID Connect
  • Almacenamiento de contraseñas (bcrypt, Argon2)
  • Implementación de MFA
  • Patrones de autenticación de API
  • RBAC y ABAC

Errores comunes para enseñar:

// BAD: JWT in localStorage (XSS can steal it)
localStorage.setItem('token', jwt);

// BETTER: HttpOnly cookie (not accessible via JavaScript)
// Set via response header:
// Set-Cookie: token=jwt; HttpOnly; Secure; SameSite=Strict

// BAD: Checking JWT signature but not expiration
const decoded = jwt.verify(token, secret);
// Token could be expired!

// GOOD: Verify all claims
const decoded = jwt.verify(token, secret, {
algorithms: ['HS256'],
maxAge: '1h',
issuer: 'your-app'
});

Recursos:

RecursoTipoEnlace
OWASP Authentication Cheat SheetGuíacheatsheetseries.owasp.org
OAuth 2.0 SimplifiedLibrooauth.com
Auth0 BlogArtículosauth0.com/blog
JWT.ioAprendizajejwt.io/introduction

5: Pruebas de seguridad para desarrolladores

Duración: 4-6 horas
Destinatario: Desarrolladores y QA (L2)

Los desarrolladores deben escribir pruebas de seguridad, no depender solo de los equipos de seguridad.

Tipos de pruebas de seguridad:

TipoQué pruebaCuándo usarHerramientas
Pruebas unitarias de seguridadFunciones de seguridad individualesCada commitJest, pytest, JUnit
Pruebas de integración de seguridadFlujos de autenticación, control de accesoCada PRSupertest, requests
SASTPatrones del código fuenteCI/CDSemgrep, CodeQL, Bandit
DASTAplicación en ejecuciónStagingOWASP ZAP, Nuclei
Escaneo de dependenciasCVEs conocidos en libreríasCada buildSnyk, Dependabot
Pruebas de fuzzingCasos extremos, fallosPeriódicoAFL, libFuzzer

Escribiendo pruebas de seguridad:

// Authentication tests
describe('Authentication', () => {
test('should reject invalid credentials', async () => {
const res = await request(app)
.post('/api/login')
.send({ username: 'user', password: 'wrong' });
expect(res.status).toBe(401);
});

test('should not leak user existence via timing', async () => {
const start1 = Date.now();
await request(app).post('/api/login').send({ username: 'exists', password: 'wrong' });
const time1 = Date.now() - start1;

const start2 = Date.now();
await request(app).post('/api/login').send({ username: 'nonexistent', password: 'wrong' });
const time2 = Date.now() - start2;

// Response times should be similar
expect(Math.abs(time1 - time2)).toBeLessThan(50);
});
});

// Authorization tests
describe('Authorization', () => {
test('should deny access to other users resources', async () => {
const user1Token = await login('user1', 'password1');
const res = await request(app)
.get('/api/users/user2/data')
.set('Authorization', `Bearer ${user1Token}`);
expect(res.status).toBe(403);
});
});

// Input validation tests
describe('Input Validation', () => {
test('should reject SQL injection attempts', async () => {
const res = await request(app)
.get('/api/users')
.query({ id: "1' OR '1'='1" });
expect(res.status).toBe(400);
});

test('should reject XSS in user input', async () => {
const res = await request(app)
.post('/api/comments')
.send({ text: '<script>alert("xss")</script>' });
// Either reject or sanitize
expect(res.body.text).not.toContain('<script>');
});
});

Recursos:

RecursoTipoEnlace
OWASP Testing GuideGuía integralowasp.org/www-project-web-security-testing-guide
BDD SecurityFrameworkgithub.com/iriusrisk/bdd-security
OWASP ZAPHerramienta DASTzaproxy.org
NucleiEscáner basado en plantillasnuclei.projectdiscovery.io

6: Modelado de amenazas

Duración: 2-4 horas
Destinatario: Desarrolladores senior, Tech leads (L2-L3)

El modelado de amenazas identifica problemas de seguridad durante el diseño, antes de que se escriba el código.

Modelo STRIDE:

AmenazaDescripciónEjemploMitigación
Spoofing (Suplantación)Fingir ser otra personaCredenciales robadasAutenticación fuerte, MFA
Tampering (Manipulación)Modificar datosCambiar precios en el carritoComprobaciones de integridad, firmas
Repudiation (Repudio)Negar acciones«Yo no hice esa compra»Registro de auditoría
Information Disclosure (Divulgación de información)Exposición de datosVolcado de base de datosCifrado, control de acceso
Denial of Service (Denegación de servicio)Hacer el sistema no disponibleAtaque DDoSLimitación de tasa, escalado
Elevation of Privilege (Elevación de privilegios)Obtener acceso no autorizadoAcceso de administrador sin serloMínimo privilegio, RBAC

Proceso simple de modelado de amenazas:

  1. ¿Qué estamos construyendo? Dibuje un diagrama de flujo de datos. Identifique componentes, almacenes de datos y límites de confianza.
  2. ¿Qué puede salir mal? Aplique STRIDE a cada componente. Haga una lluvia de ideas sobre escenarios de ataque.
  3. ¿Qué vamos a hacer al respecto? Priorice las amenazas (probabilidad × impacto). Defina mitigaciones. Cree requisitos de seguridad.
  4. ¿Lo hicimos bien? Revise la completitud del modelo. Verifique que las mitigaciones estén implementadas. Actualice el modelo a medida que el diseño cambie.

Recursos:

RecursoTipoEnlace
OWASP Threat ModelingGuíaowasp.org/www-community/Threat_Modeling
Microsoft Threat Modeling ToolHerramientamicrosoft.com/en-us/securityengineering/sdl/threatmodeling
Threat Modeling: Designing for SecurityLibroAdam Shostack
OWASP Threat DragonHerramienta de código abiertoowasp.org/www-project-threat-dragon

Formación en seguridad para ingenieros de QA

Los ingenieros de QA son multiplicadores de fuerza para la seguridad. Ya piensan en casos extremos y en romper cosas: las pruebas de seguridad son una extensión natural.

Currículo de pruebas de seguridad para QA

MóduloTemasDuración
Conceptos básicos de pruebas de seguridadTipos de vulnerabilidades, OWASP Top 10, mentalidad de prueba4 horas
Pruebas de seguridad manualesConceptos básicos de Burp Suite, interceptar solicitudes, probar autenticación8 horas
Pruebas de seguridad automatizadasOWASP ZAP, Nuclei, integración CI4 horas
Pruebas de seguridad de APIVulnerabilidades de API, pruebas de seguridad con Postman, fuzzing4 horas
Reporte de vulnerabilidadesEscribir buenos reportes de errores, evaluación de gravedad2 horas

Herramientas para pruebas de seguridad de QA

HerramientaPropósitoCurva de aprendizajeEnlace
Burp Suite CommunityProxy web, pruebas manualesMediaportswigger.net/burp
OWASP ZAPEscáner web, alternativa gratuita a BurpMediazaproxy.org
PostmanPruebas de API con pruebas de seguridadBajapostman.com
NucleiEscaneo basado en plantillasBajanuclei.projectdiscovery.io
Browser DevToolsInspección de solicitudes, análisis de cookiesBajaIntegrado

Lista de verificación de pruebas de seguridad de QA

## Lista de verificación de pruebas de seguridad de QA

### Autenticación
- [ ] Probar con credenciales inválidas
- [ ] Probar el bloqueo de cuenta tras intentos fallidos
- [ ] Probar el flujo de restablecimiento de contraseña para enumeración de cuentas
- [ ] Probar el tiempo de expiración de sesión
- [ ] Probar el manejo de sesiones simultáneas
- [ ] Probar la funcionalidad de «recordarme»

### Autorización
- [ ] Probar el acceso a datos de otros usuarios (IDOR)
- [ ] Probar el acceso basado en roles (¿puede el usuario acceder como administrador?)
- [ ] Probar el control de acceso a nivel de función
- [ ] Probar después del cierre de sesión (¿se puede acceder a páginas en caché?)

### Validación de entrada
- [ ] Probar con cargas de inyección SQL
- [ ] Probar con cargas XSS
- [ ] Probar con caracteres especiales
- [ ] Probar con entradas muy largas
- [ ] Probar con entradas vacías/nulas
- [ ] Probar con tipos de datos inesperados

### Lógica de negocio
- [ ] Probar condiciones de carrera (enviar dos veces rápidamente)
- [ ] Probar la omisión de flujo de trabajo (saltar pasos)
- [ ] Probar valores negativos (cantidad negativa, precio negativo)
- [ ] Probar el desbordamiento de enteros

### Archivos
- [ ] Probar la carga de archivos ejecutables
- [ ] Probar la carga de archivos sobredimensionados
- [ ] Probar el path traversal en nombres de archivos
- [ ] Probar el acceso a archivos sin autorización

### Específico de API
- [ ] Probar sin autenticación
- [ ] Probar con tokens manipulados
- [ ] Probar la limitación de tasa
- [ ] Probar la asignación masiva
- [ ] Probar la exposición excesiva de datos

Conceptos básicos de Burp Suite para QA

Configuración: Configure el proxy (127.0.0.1:8080), instale el certificado CA de Burp en el navegador, navegue por la aplicación: Burp captura todo el tráfico.

Pestañas clave:

  • Proxy → Historial HTTP — vea todas las solicitudes
  • Repeater — modifique y reenvíe solicitudes individuales
  • Intruder — pruebas de carga automatizadas
  • Scanner — escaneo automatizado de vulnerabilidades (solo versión Pro)

Pruebas comunes: cambiar el ID de usuario en la URL (IDOR) · modificar el cuerpo JSON (autorización) · eliminar cabeceras de autenticación (requisitos de autenticación) · inyectar cargas (validación de entrada)

Rutas de aprendizaje integrales

Ruta para desarrollador junior (0-2 años)

Meses 1-3: Fundamentos

  • Curso de fundamentos de seguridad
  • Formación en OWASP Top 10
  • Conceptos básicos de codificación segura específica del lenguaje
  • Evaluación: Cuestionario de seguridad (aprobar con 80 %)

Meses 4-6: Habilidades prácticas

  • Completar PortSwigger Web Security Academy (básico)
  • Practicar en WebGoat
  • Escribir las primeras pruebas unitarias de seguridad
  • Evaluación: Encontrar 3 vulnerabilidades en una app de prueba

Meses 7-12: Integración

  • Aplicar codificación segura en el trabajo diario
  • Participar en revisiones de código de seguridad
  • Unirse a un evento CTF
  • Evaluación: Ejercicio de revisión de código seguro

Objetivo al final del año: Competencia L1 en todas las áreas

Ruta para desarrollador de nivel medio (2-5 años)

Trimestre 1:

  • Formación avanzada en OWASP
  • Análisis profundo de autenticación y autorización
  • Evaluación: Cuestionario de seguridad intermedio

Trimestre 2:

  • Pruebas de seguridad con Burp Suite
  • Seguridad de API
  • Evaluación: Encontrar vulnerabilidades usando Burp

Trimestre 3:

  • Introducción al modelado de amenazas
  • Participar en sesión de modelado de amenazas
  • Evaluación: Liderar el modelado de amenazas para una pequeña funcionalidad

Trimestre 4:

  • Guiar a un desarrollador junior
  • Contribuir a la documentación de seguridad
  • Evaluación: Revisión de código con enfoque en seguridad

Objetivo al final del año: Competencia L2, listo para el rol de Security Champion

Ruta para desarrollador senior / Tech lead

Áreas de enfoque:

  • Seguridad de arquitectura
  • Liderar sesiones de modelado de amenazas
  • Requisitos de seguridad para nuevos proyectos
  • Guiar a otros
  • Respuesta a incidentes de seguridad

Actividades:

  • Completar el curso de modelado de amenazas
  • Liderar 3+ sesiones de modelado de amenazas
  • Revisar la arquitectura de seguridad para nuevos proyectos
  • Presentar en una charla técnica interna sobre un tema de seguridad
  • Participar en un ejercicio de respuesta a incidentes

Objetivo: Competencia L3, Security Champion o colaborando con el equipo de seguridad

Preguntas de autoevaluación

  1. ¿Cuáles son los cuatro niveles del marco de competencias en seguridad?
  2. ¿Qué vulnerabilidad del OWASP Top 10 implica ejecutar datos no confiables como código?
  3. ¿Por qué una consulta parametrizada es más segura que la interpolación de cadenas para SQL?
  4. ¿Cuál es la diferencia entre SAST y DAST?
  5. ¿Qué significa STRIDE?
  6. ¿Por qué deben aprender pruebas de seguridad los ingenieros de QA?

Enlaces y recursos

Cursos y formación

RecursoTipoCosteEnlace
PortSwigger Web Security AcademyInteractivoGratuitoportswigger.net/web-security
OWASP WebGoatPrácticoGratuitoowasp.org/www-project-webgoat
Hack The Box AcademyLaboratoriosNivel gratuitoacademy.hackthebox.com
TryHackMeLaboratorios para principiantesNivel gratuitotryhackme.com
PentesterLabEjercicios$20/mespentesterlab.com
SANS Secure CodingCertificaciónDe pagosans.org

Hojas de referencia y guías

Herramientas SAST por lenguaje

LenguajeHerramientaEnlace
Multi-lenguajeSemgrepsemgrep.dev
Multi-lenguajeCodeQLcodeql.github.com
PythonBanditbandit.readthedocs.io
JavaScriptESLint security pluginsgithub.com/eslint-community/eslint-plugin-security
JavaFind Security Bugsfind-sec-bugs.github.io
Gogosecgithub.com/securego/gosec
C#Security Code Scansecurity-code-scan.github.io

Aplicaciones vulnerables para práctica

Plataformas CTF

  • CTFd — Organice su propio CTF
  • PicoCTF — Amigable para principiantes
  • CTFtime — Calendario de eventos CTF

Conclusión

Un currículo que no se corresponde con lo que sus desarrolladores realmente construyen es un esfuerzo desperdiciado. Comience por lo que conoce: su stack, sus vulnerabilidades, sus incidentes, y construya desde ahí.

El objetivo no es convertir a cada desarrollador en un experto en seguridad. Es hacerlos lo suficientemente fluidos como para no introducir las mismas categorías de errores dos veces.

Qué sigue

Siguiente: evaluación y mapeo de competencias — cómo evaluar el estado de sus desarrolladores antes de comenzar la formación.