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.
Doce defectos conviviendo en código que «funciona»
// 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:
Marca la línea o las líneas con error y pulsa Comprobar.
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».
Doce defectos en una página valen más que doce páginas de teoría del defecto.
Tu texto se guarda sólo en este dispositivo.
Comentarios
Inicia sesión para comentar.
Todavía no hay comentarios. Sé la primera persona en opinar.