Docs/Para estudiantes/Modo práctica

Modo práctica

El modo práctica presenta desafíos de revisión de código en los que identificas código vulnerable y eliges la corrección correcta. Disponible en más de 200 temas que cubren OWASP Top 10 (Web), OWASP API Top 10, OWASP Mobile Top 10 y OWASP Client-Side Top 10, en varios lenguajes.

Cómo funciona

Cada desafío sigue un sistema de dos fases diseñado para evaluar tanto tu capacidad de detectar vulnerabilidades como tus habilidades de remediación:

Fase 1 — Encontrar la vulnerabilidad

Lee un fragmento de código e identifica qué bloque contiene la vulnerabilidad de seguridad. Haz clic en el bloque correcto entre varias opciones resaltadas para avanzar.

Fase 2 — Elegir la corrección

Una vez identificada la vulnerabilidad, elige la corrección correcta entre varias opciones. Todas parecen plausibles, pero solo una resuelve adecuadamente el problema de seguridad.

Puntuación: Cada desafío vale hasta 200 XP: 100 XP por cada fase si aciertas a la primera. Los intentos repetidos y el uso de pistas reducen la puntuación por fase (consulta Puntuación y XP más abajo).

Interfaz del desafío

Así es como se ve un desafío típico de revisión de código:

app.securecodinghub.com/topic/sql-injection/challenge/0
1
Encontrar vulnerabilidad
2
Elegir corrección
3
Completada
0XP
Riesgo alto

SQL Injection en la búsqueda de usuario

backend / python / web

Escenario

Un endpoint de detalle de usuario toma el id de la query string y lo usa para obtener la fila correspondiente. Uno de los bloques candidatos de abajo confía en ese valor cuando no debería.

PYTHONviews.py
12def get_user(request):
13 user_id = request.GET['id']
14 query = "SELECT * FROM users WHERE id=" + user_id
15 cursor.execute(query)
16 return JsonResponse(cursor.fetchone())
Los bloques resaltados son candidatos: elige el vulnerable.

Elegir tu lenguaje

Cada tema tiene desafíos en varios lenguajes de programación. Tu preferencia de stack determina qué lenguaje se muestra por defecto: los desarrolladores backend ven desafíos en Python, Java o Go, mientras que los desarrolladores frontend ven desafíos en React, Vue o Angular.

Puedes cambiar de lenguaje en cualquier momento usando el selector de lenguaje. Tu preferencia se guarda para que siempre veas primero los desafíos en tu stack preferido.

JavaScript
TypeScript
Python
Java
C#
PHP
Go
React
Vue
Angular
Swift
Kotlin

Uso de pistas

Cada fase tiene su propio botón de pista. Usar una pista reduce a la mitad la puntuación que ganas en esa fase, con un mínimo de 10 XP: así, una fase resuelta a la primera que vale 100 XP pasa a 50 XP si usas la pista, y una fase resuelta al segundo intento que vale 60 XP pasa a 30 XP. Las pistas ofrecen orientación específica sin dar la respuesta: te apuntan en la dirección correcta y siguen exigiendo que pienses críticamente.

Las pistas son opcionales. Son especialmente útiles cuando te encuentras con un tipo de vulnerabilidad desconocido por primera vez.

Puntuación y XP

Cada fase se puntúa de forma independiente. Una respuesta correcta al primer intento otorga la XP completa de la fase; los intentos erróneos y el uso de pistas la reducen.

Resultado de la faseSin pistaCon pista
Correcto al 1.er intento100 XP50 XP
Correcto al 2.º intento60 XP30 XP
Correcto al 3.er intento o posterior30 XP15 XP
Máximo por desafío (las dos fases a la primera, sin pistas)200 XP

La reducción por pista es un recorte del 50% con un mínimo de 10 XP, por lo que incluso una fase resuelta al 3.er intento con pista sigue otorgando al menos 10 XP. Las dos fases funcionan de forma independiente: una pista o un intento erróneo en la Fase 1 no afectan a la Fase 2.

Qué ocurre cuando fallas

El primer intento fallido en cualquiera de las fases te invita a volver a intentarlo con el mismo código. Tras el segundo intento fallido en la Fase 1, aparece un breve diálogo narrativo que explica las consecuencias en el mundo real de la vulnerabilidad que no detectaste antes de dejarte volver a intentarlo. No hay límite de intentos: puedes seguir intentándolo, pero cada intento adicional a partir del tercero deja la fase con un tope de 30 XP.

Finalización del desafío

Tras completar ambas fases, ves un desglose de la puntuación:

app.securecodinghub.com/topic/sql-injection/challenge/0
Desafío completado
+200 XP
Fase 1 — Encontrar vulnerabilidad100 / 100
Fase 2 — Elegir corrección100 / 100
Próximos pasos: Explora Modo aprendizaje para recorrer escenarios de ataque interactivos, o pasa directamente a practicar desde el panel.

Lectura del flujo de la Fase 1 a la Fase 2

La estructura en dos fases existe porque la detección de vulnerabilidades y su remediación son habilidades distintas. La Fase 1 entrena tu ojo: dada una función o método completos, qué línea es la peligrosa. No se te pide que escribas código; se te pide que lo leas como lo haría un revisor. La línea vulnerable rara vez es la sintácticamente más interesante. Suele ser una línea discreta que hace algo que un desarrollador escribiría sin pensar, como concatenar un parámetro de petición en una cadena que más tarde se parseará.

La Fase 2 entrena tu criterio. Una vez sabes dónde está el problema, la plataforma te muestra varias correcciones plausibles. La mayoría compilan, se ejecutan y parecen razonables. Solo una cierra por completo la vulnerabilidad. Algunas opciones parchean el síntoma evidente sin tocar la primitiva subyacente. Otras se exceden y rompen la función. El objetivo de la Fase 2 es hacerte razonar por qué una corrección funciona, no solo si parece más segura que el original. Trata las respuestas incorrectas como una guía de estudio: cada una es un error real que cometen desarrolladores reales en pull requests reales.

Por qué adivinar arruina la curva de aprendizaje

El sistema de pistas reduce a la mitad la XP de una fase (con un mínimo de 10 XP), lo que suena a penalización pero está estructurado como un intercambio. El intercambio es orientación significativa a cambio de menor puntuación. Adivinar sin pista te cuesta la misma XP y no te enseña nada, porque el bucle de retroalimentación es demasiado grueso para aprender de él. Si te encuentras leyendo el fragmento durante menos de treinta segundos antes de hacer clic, casi con toda seguridad estás adivinando. Frena, lee el fragmento dos veces, formula una hipótesis sobre dónde está el límite de confianza y luego haz clic.

El ritmo adecuado para una nueva clase de vulnerabilidad es leer con atención, usar la pista cuando te atasques y aceptar la reducción de puntuación como el coste de aprender. Tras tres o cuatro desafíos de la misma clase, dejas de necesitar la pista. Tras diez, empiezas a ver el mismo patrón en tu propio código. Esa curva es imposible de comprimir adivinando. Para un contexto más profundo sobre las cadenas de ataque detrás de estos fragmentos, prueba el escenario equivalente en Modo aprendizaje.