Desarrollo de Software con IA

Gimnasio de desconfianza: encuentra los 12 errores

Auditar soluciones generadas por IA y señalar defectos de seguridad, arquitectura y datos.

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

Las doce son señales que ya conocías puestas en fila. Ninguna requiere saber más tecnología: requiere traer la lista y no confiarse en que «se ve bien».
#DefectoFamilia / señalDaño y corrección
1Paquete fancy-form-validatoralucinación de dependencia (cnf-oa01)no existe en el registro público: buscar antes de instalar, o hacerlo en 30 líneas propias
2Contraseña en el códigoseñal 1 (cnf-oa02)viaja al repo para siempre: variable de entorno
3API interna por httpsecreto en tránsito (M10-HTTPS)credenciales y datos viajan en claro: solo https
4SQL cosido con +señal 2 (cnf-oa02)SQL injection directo: consulta parametrizada
5Guarda la contraseña en claro y sin hashM9-contraseñasfiltración = todas las contraseñas usables de golpe: hash + bcrypt/argon
6CORS estrella en ruta de clientesseñal 6 (cnf-oa02)cualquier sitio llama la API con la sesión del usuario: origen específico
7Log con la lista completa de clientesseñal 7 (cnf-oa02)la bitácora se vuelve la base de datos paralela sin proteger: loggear identificadores, no contenido
8DELETE FROM clientes sin WHEREprotocolo anti-letal 1 (cnf-oa03)borra TODA la tabla, no la cuenta del usuario: WHERE id del usuario autenticado
9catch vacío en la auditoríaseñal 5 (cnf-oa02)el intento de borrado queda sin rastro si auditar falla: loggear el fallo
10while(true) sin tope ni manejo de errordependencia oculta / arquitectura (cnf-oa03 domino)si el API nunca devuelve lista vacía, bucle infinito: tope de páginas y manejo de fallo
11Validación solo en el HTMLseñ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:

  1. Volver a leer el código despacio con intuición a ver si ve más.
  2. Rehacer el escaneo con las tres listas en mano (señales, familias, protocolo) buscando también ausencias: permisos, validación de servidor, respaldo.
  3. Pedirle a la misma IA que revise su propio código a ver qué encuentra.
  4. Concentrarse solo en las líneas de SQL: ahí están los errores serios.
  5. 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».

PistaDoce defectos en una página valen más que doce páginas de teoría del defecto.