Secretos en el código generado por IA: claves que acaban en el repositorio
Hola, bienvenido. En esta lección vamos a corregir el último fallo que trae el código de invoices: la clave del servicio de PDF, que el agente dejó escrita como valor por defecto en config/services.php y como valor de ejemplo en .env.example. Vamos a ver cómo llega una clave al código cuando trabajas con un agente, qué hay que hacer cuando ya está en el historial de git y cómo queda la solución, con un test que recorre config/ para que no vuelva a pasar.
Es el tercer fallo seguido del mismo grupo, código que sí está y falla en un detalle. La configuración funciona, el servicio de PDF tendría su clave y los tests pasan. El problema es dónde está escrita esa clave.
Cómo llega una clave al código con un agente
Partimos de invoices tal como lo dejamos en la lección anterior. Si vuelves a la especificación de la lección 3, la última línea dice que el PDF de cada factura se generará con un servicio externo y que "la clave del servicio ya la tenemos". Con un agente, lo más habitual es que esa clave llegue en el propio prompt: la pegas para que la tenga a mano, y el agente la usa donde le parece más útil. En invoices quedó así, en config/services.php:
Y la misma clave, como valor de PDF_API_KEY, en .env.example. ¿Por qué ahí? Porque así la aplicación funciona sin tocar el .env. El segundo argumento de env() es el valor por defecto, el que Laravel devuelve cuando la variable no existe, así que con la clave escrita ahí, cualquier instalación nueva tiene la configuración completa. Y .env.example es el archivo que se copia para crear el .env, así que el agente lo rellena con valores que funcionan. Desde el punto de vista de la tarea, las 2 decisiones son correctas.
Pero config/services.php y .env.example se versionan. El .gitignore de Laravel deja fuera el .env para que las credenciales no entren en el repositorio, y la documentación de Laravel lo explica así: si alguien consigue acceso al repositorio, cualquier credencial que haya en él queda expuesta. Una clave como valor por defecto de env() es, a efectos prácticos, una clave en el repositorio. Y hay un detalle más: al pegarla en el prompt, la clave ya ha salido de tu máquina hacia el proveedor del modelo. La hoja "Secure Coding with AI" de OWASP lo tiene en cuenta en 2 recomendaciones: no pegar claves en una terminal a la que tiene acceso una herramienta de IA, y dejar el .env fuera del contexto que la herramienta envía al proveedor.
- 02La clave ya está en el historial de git
- 03El test: ninguna clave con valor por defecto
- 04La solución: env() sin valor por defecto y .env.example vacío
- 05El circuito y la regla para el agente