Explicación del concepto
La seguridad comienza mucho antes de que construyas una gran aplicación web. Comienza la primera vez que tu código lee un nombre de archivo, acepta un valor de usuario o decide si confiar en una entrada. En proyectos para principiantes, lo peligroso no es la complejidad, sino la falsa confianza. En esta lección, trabajarás con un pequeño script que lee un archivo de una carpeta segura. El objetivo no es memorizar jerga de seguridad. El objetivo es construir un hábito saludable: nunca confíes en una ruta solo porque parezca inofensiva. Verás cómo un script puede protegerse verificando a dónde apunta realmente una ruta antes de abrir cualquier cosa. Esa misma mentalidad te ayudará más tarde con cargas, APIs, formularios y herramientas de línea de comandos. Al final de esta lección, deberías ser capaz de: • explicar por qué `eval()` no es seguro para entradas no confiables, • describir qué significa la "path traversal" en palabras sencillas, • mantener un script de lectura de archivos dentro de una carpeta fija en lugar de permitirle "deambular" por cualquier parte del sistema. Por qué esto importa: mucho código de principiante funciona bien en los "happy paths", pero se rompe en el momento en que la entrada se vuelve desordenada u hostil. El código fiable asume que las entradas defectuosas eventualmente llegarán.
Dónde poner el código
- Define las variables de color y posición en la parte superior.
- Crea la lógica de dibujo o posicionamiento de formas en el medio.
- Renderiza la salida (impresión, canvas, SVG o bloque con estilo) al final.
Referencia de comandos
- Trata cada ruta como no confiable hasta que verifiques dónde se resuelve en el disco.
- Usa `Path.resolve()` antes de leer un archivo para detectar intentos de escape como `../secret.txt`.
- Nunca uses `eval()` en texto controlado por el usuario; analizar datos y ejecutar código no son lo mismo.
- Mantén los experimentos en una carpeta dedicada para que los errores queden contenidos.
Guía paso a paso
- Ejecuta el script y confirma que imprime el contenido de `notes.txt` desde `lesson_workspace`.
- Cambia el nombre del archivo a uno que no exista, ejecuta de nuevo y lee cuidadosamente el `FileNotFoundError`.
- Prueba un valor peligroso como `../outside.txt` y predice qué debería pasar antes de ejecutarlo.
- Añade un segundo archivo seguro dentro de `lesson_workspace` y confirma que la función aún puede leerlo normalmente.
- Escribe una frase explicando por qué verificar la ruta resuelta es más seguro que confiar en el nombre de archivo "en crudo".
Ejercicios prácticos
- Con tus propias palabras, explica la diferencia entre leer un archivo local seguro y ejecutar texto arbitrario como código.
- Compara `Path` y `os.path` en cuanto a legibilidad y escribe qué estilo prefieres para scripts de principiantes.
- Encuentra un ejemplo en línea de un error de "path traversal" o un uso inseguro de `eval()` y resume la lección en tres frases sencillas.
Retos de código
- Actualiza la función para que solo permita archivos `.txt` y rechace todo lo demás con un mensaje de error claro.
- Devuelve tanto el texto de vista previa como el tamaño del archivo, manteniendo las comprobaciones de seguridad en un solo lugar.
Mini tareas de práctica
- Crea `lesson_workspace/` en `.gitignore` para que tus archivos de práctica no saturen el proyecto.
- Anota una regla que quieras recordar: nunca confíes en rutas "en crudo" de la entrada.
- Elimina cualquier experimento antiguo donde usaste `eval()` solo porque te pareció conveniente.
Error común
Mixing x and y axes or using wrong coordinate origin causes shapes to appear in unexpected places.
Mini reto de la vida real
Draw one square, one triangle, and one circle, then move X marker 2 steps right and 1 step down.