📛 Come evitare di committare username e password in un programma Python

 

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.)

🔗 Ti piace Techelopment? Dai un'occhiata al sito per tutti i dettagli!

❌ 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 .env in 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.json senza 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
  • .gitignore configurato correttamente
  • ✔ Variabili d’ambiente quando necessario
  • .env solo 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