![]() |
Inserire username e password direttamente nel codice sorgente è una delle cause più comuni di data leak e incidenti di sicurezza.
Quando il codice viene versionato con Git e pubblicato (anche per errore), le credenziali diventano irrecuperabili: anche se rimosse, restano nella cronologia.
In questo articolo vedremo le migliori tecniche per gestire le credenziali in Python in modo sicuro, evitando che finiscano nei commit.
Ricorda che le tecniche descritte non si applicano solo a Python ma a qualsiasi applicativo software
(client, frontend, API, backend, modulo, ecc.)
❌ Il problema: credenziali hardcoded
Esempio da evitare assolutamente:
DB_USER = "admin"
DB_PASSWORD = "supersegreta123"
connect(db_user=DB_USER, db_password=DB_PASSWORD)
Perché è pericoloso
- Le credenziali finiscono nel repository Git
- Chiunque abbia accesso al codice può leggerle
- Anche i commit vecchi restano accessibili
- Rotazione delle password più complessa
✅ Tecnica 1: Variabili d’ambiente (Environment Variables)
Concetto
Le credenziali vengono salvate fuori dal codice, nel sistema operativo, e lette a runtime.
Vantaggi
- Nessuna credenziale nel repository
- Standard per ambienti cloud e CI/CD
- Supportato nativamente da Python
Impostare le variabili d’ambiente
Linux / macOS
export DB_USER="admin"
export DB_PASSWORD="supersegreta123"
Windows (PowerShell)
setx DB_USER "admin"
setx DB_PASSWORD "supersegreta123"
Leggerle in Python
import os
db_user = os.getenv("DB_USER")
db_password = os.getenv("DB_PASSWORD")
if not db_user or not db_password:
raise RuntimeError("Credenziali mancanti")
connect(db_user=db_user, db_password=db_password)
Spiegazione
os.getenv()legge la variabile senza generare errori- Le credenziali non appaiono nel codice
- Ogni ambiente può avere valori diversi
✅ Tecnica 2: File .env + python-dotenv
Ideale per sviluppo locale.
Concetto
Le credenziali vengono salvate in un file .env non versionato, caricato all’avvio dell’applicazione.
Installazione
pip install python-dotenv
File .env (NON da committare)
DB_USER=admin
DB_PASSWORD=supersegreta123
Aggiungere .env a .gitignore
.env
Codice Python
from dotenv import load_dotenv
import os
load_dotenv()
db_user = os.getenv("DB_USER")
db_password = os.getenv("DB_PASSWORD")
connect(db_user=db_user, db_password=db_password)
Spiegazione
load_dotenv()carica il file.envin memoria- Il file resta locale
- Ottimo compromesso tra sicurezza e semplicità
✅ Tecnica 3: File di configurazione esterni (config.json / yaml)
Utile per configurazioni complesse, meno per password critiche.
Esempio config.json
{
"database": {
"user": "admin",
"password": "supersegreta123"
}
}
⚠️ Il file va escluso dal repository.
Lettura in Python
import json
with open("config.json") as f:
config = json.load(f)
db_user = config["database"]["user"]
db_password = config["database"]["password"]
connect(db_user=db_user, db_password=db_password)
Best practice
- Usare
config.example.jsonsenza segreti - Committare solo il file di esempio
✅ Tecnica 4: Inserimento manuale con getpass
Utile per script CLI o accessi occasionali.
Esempio
from getpass import getpass
username = input("Username: ")
password = getpass("Password: ")
connect(db_user=username, db_password=password)
Spiegazione
- La password non viene mostrata a schermo
- Non viene salvata su disco
- Ideale per tool amministrativi
✅ Tecnica 5: Keyring di sistema (password manager OS)
Concetto
Le credenziali vengono salvate nel password manager del sistema operativo.
Vantaggi
- Molto sicuro
- Nessuna password in chiaro
- Ideale per applicazioni desktop
Installazione
pip install keyring
Salvare la password (una sola volta)
import keyring
keyring.set_password(
"my_app",
"admin",
"supersegreta123"
)
Recuperarla
import keyring
password = keyring.get_password("my_app", "admin")
connect(db_user="admin", db_password=password)
✅ Tecnica 6: Secret Manager (produzione / cloud)
Per ambienti enterprise o cloud:
- AWS Secrets Manager
- Azure Key Vault
- HashiCorp Vault
- Google Secret Manager
Vantaggi
- Rotazione automatica
- Audit e controllo accessi
- Massima sicurezza
(Questa tecnica richiede SDK e configurazioni specifiche)
📋 Memo: Separare codice e configurazione
Best practice universale
- Il codice non deve conoscere i segreti
- I segreti arrivano dall’ambiente
- Il repository deve essere “safe by default”
🔐 Checklist finale di sicurezza
- ✔ Nessuna password nel codice
- ✔
.gitignoreconfigurato correttamente - ✔ Variabili d’ambiente quando necessario
- ✔
.envsolo in locale - ✔ File di esempio senza segreti
- ✔ Rotazione periodica delle credenziali
Conclusione
Evitare di committare username e password non è opzionale, ma una responsabilità fondamentale dello sviluppatore.
Python offre strumenti semplici e potenti per gestire i segreti in modo sicuro: sta a noi usarli correttamente.
Non dimenticare che queste tecniche valgono per qualsiasi linguaggio di programmazione e qualunque sia il tipo di applicazione software 😉
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment
