Las reglas del gimnasio
Esto no es lectura: es reps. La solución de abajo fue «generada por IA» para una tienda ficticia —registro de clientes, búsqueda, borrado de cuentas— y RESUELVE lo pedido: si la pruebas con clics amables, funciona. Contiene doce defectos de seguridad, datos y arquitectura, todos con nombre y apellido de los que ya estudiaste. Reglas: 1) no mires la respuesta hasta hacer tu pasada, 2) escanea con lista (siete señales + familias + protocolo), 3) anota número y descripción breve de cada hallazgo. Puntuación: 4 o menos, repite el módulo 10; 8 o más, ya eres auditor de tu propio proyecto.
// solution.js — generada por IA para "gestion de clientes de la tienda"\nimport { FancyValidator } from "fancy-form-validator"; // ??? (1)\n\nconst DB_PASS = "supersecreta2024"; // (2)\nconst API = "http://api.tienda-interna.com"; // (3)\n\napp.post("/registro", (req, res) => {\n db.run("INSERT INTO usuarios VALUES ('" + req.body.email + "'," +\n "," + req.body.pass + ")"); // (4)\n res.json({ ok: true }); // (5)\n});\n\napp.get("/clientes", (req, res) => {\n res.setHeader("Access-Control-Allow-Origin", "*"); // (6)\n const r = db.all("SELECT * FROM clientes");\n console.log("sirviendo clientes:", r); // (7)\n res.json(r);\n});\n\napp.post("/borrar-cuenta", (req, res) => {\n if (!req.session) return res.sendStatus(401);\n db.run("DELETE FROM clientes"); // (8)\n try { auditar(req); } catch (e) { } // (9)\n res.json({ borrado: "completo" });\n});\n\napp.get("/buscar", (req, res) => {\n let pagina = 1;\n while (true) { // (10)\n const r = await api.fetch(API + "/catalogo?page=" + pagina);\n if (!r.items.length) break;\n pagina++;\n }\n});\n\n// "los campos del formulario ya traen required en el HTML" // (11)\n// nota al final: "no hace falta respaldar: la base es chica" // (12)Respuesta del entrenador: los doce, uno por uno
| # | Defecto | Familia / señal | Daño y corrección |
|---|---|---|---|
| 1 | Paquete fancy-form-validator | alucinación de dependencia (cnf-oa01) | no existe en el registro público: buscar antes de instalar, o hacerlo en 30 líneas propias |
| 2 | Contraseña en el código | señal 1 (cnf-oa02) | viaja al repo para siempre: variable de entorno |
| 3 | API interna por http | secreto en tránsito (M10-HTTPS) | credenciales y datos viajan en claro: solo https |
| 4 | SQL cosido con + | señal 2 (cnf-oa02) | SQL injection directo: consulta parametrizada |
| 5 | Guarda la contraseña en claro y sin hash | M9-contraseñas | filtración = todas las contraseñas usables de golpe: hash + bcrypt/argon |
| 6 | CORS estrella en ruta de clientes | señal 6 (cnf-oa02) | cualquier sitio llama la API con la sesión del usuario: origen específico |
| 7 | Log con la lista completa de clientes | señal 7 (cnf-oa02) | la bitácora se vuelve la base de datos paralela sin proteger: loggear identificadores, no contenido |
| 8 | DELETE FROM clientes sin WHERE | protocolo anti-letal 1 (cnf-oa03) | borra TODA la tabla, no la cuenta del usuario: WHERE id del usuario autenticado |
| 9 | catch vacío en la auditoría | señal 5 (cnf-oa02) | el intento de borrado queda sin rastro si auditar falla: loggear el fallo |
| 10 | while(true) sin tope ni manejo de error | dependencia oculta / arquitectura (cnf-oa03 domino) | si el API nunca devuelve lista vacía, bucle infinito: tope de páginas y manejo de fallo |
| 11 | Validación solo en el HTML | señal 3 (cnf-oa02) | cualquiera POSTea directo al servidor sin el required: validar en el servidor, el cliente es UX |
| 12 | «No hace falta respaldar» | protocolo paso 2 (cnf-oa03) | el tamaño no es defensa: basta un borrado masivo o una migración fallida; copia siempre antes de operaciones masivas |
Prueba
De los doce defectos, ¿cuál es el que borra la base de datos ENTERA con una sola petición legítima?
El defecto 5 (contraseña en claro) es el menos grave de los doce porque no rompe ninguna función: el registro funciona perfecto.
Tu turno con espejos
Un alumno encontró solo 5 de los 12 y quiere mejorar su escaneo. Señala el enfoque que más le va a rendir:
- Volver a leer el código despacio con intuición a ver si ve más.
- Rehacer el escaneo con las tres listas en mano (señales, familias, protocolo) buscando también ausencias: permisos, validación de servidor, respaldo.
- Pedirle a la misma IA que revise su propio código a ver qué encuentra.
- Concentrarse solo en las líneas de SQL: ahí están los errores serios.
- Ignorar los comentarios: son texto, no código.
Identifica la linea con error.
Cierra el gimnasio con la transferencia: corre el escaneo de doce puntos contra TU proyecto real (o el ficticio del curso) y anota hallazgo o «limpio con evidencia» por categoría. Luego pídele a la IA la corrección de cada hallazgo citándole el defecto y la corrección de la tabla: «tienes un patrón del defecto 4: SQL cosido; paramétriza».