Una clave publicada sin querer
Un programador de una empresa de reparto en Málaga sube su código a un repositorio público. Dentro del código está la contraseña de la base de datos.
A las pocas horas, un programa automático la encuentra. Esa noche alguien descarga las direcciones de todos los clientes.
Borrar la línea al día siguiente no sirve: la contraseña sigue en el historial.
Al final de esta lección
Nota
Puedo mantener los secretos fuera del código.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Secreto | dato que da acceso, como una contraseña o una clave | |
| Variable de entorno | valor que el sistema da al programa al arrancar | DB_PASSWORD |
| Archivo .env | archivo local con los secretos, fuera del repositorio | |
| .gitignore | lista de archivos que Git no sube | |
| Validar | comprobar que una entrada tiene la forma esperada |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un secreto vive fuera del código
El código se copia, se comparte y se sube a repositorios. Todo lo que lleva dentro acaba viéndolo mucha gente.
Por eso el secreto se guarda aparte. En tu ordenador va en un archivo .env, apuntado en el .gitignore. En el servidor lo pone el sistema como variable de entorno.
El programa solo lee el nombre de la variable. Nunca ve el secreto escrito en su código.
Prueba: un secreto en un archivo .env
mkdir -p tienda && cd tienda
# El secreto vive en un archivo .env que no se sube al repositorio
printf 'DB_PASSWORD=Tortilla-2026\n' > .env
printf '.env\n' > .gitignore
# Carga el archivo y deja la variable lista para los programas
set -a; . ./.env; set +a
echo "La contraseña mide ${#DB_PASSWORD} caracteres"
cat .gitignore
# Añade API_KEY=abc123 al .env con printf y muestra su longitud.
Prueba: leer el secreto desde Python
import os
# En un servidor real, esta línea la pone el sistema, no el código
os.environ["DB_PASSWORD"] = "Tortilla-2026"
if "DB_PASSWORD" in os.environ:
password = os.environ["DB_PASSWORD"]
print("Conectando con una contraseña de", len(password), "caracteres")
else:
print("Falta DB_PASSWORD: el programa se para")
# Nunca imprimas el secreto entero en un log.
# Borra la línea de os.environ y vuelve a ejecutar.
Un error frecuente
Advertencia
Mucha gente cree que basta con borrar la contraseña en un commit nuevo. El commit anterior la sigue guardando. Si un secreto llega a un repositorio, cámbialo de inmediato, porque hay que darlo por robado.
Ninguna entrada es de fiar
Un formulario, un archivo subido o una dirección web traen datos de fuera. Pueden traer cualquier cosa.
Antes de usar una entrada, valídala. Lo más seguro es una lista de lo que se permite: la forma, la longitud y los caracteres esperados.
Todo lo demás se rechaza. Es más fácil decir qué es correcto que adivinar todos los ataques.
Ejemplo: validar un código postal
| Entrada | ¿5 cifras? | ¿Provincia 01 a 52? | Resultado |
|---|---|---|---|
| 28013 | Sí | Sí, 28 | Se acepta |
| 2801 | No | No se mira | Se rechaza |
| 60100 | Sí | No, 60 | Se rechaza |
| 1' OR '1'='1 | No | No se mira | Se rechaza |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.