Hardcode in programmazione: cos'è, cause e come evitarlo

Autore: IT Sectr Pubblicato: 2026-07-26 Tempo di lettura: 10 min

Hardcode è la pratica di inserire valori immutabili direttamente nel codice sorgente invece di esternalizzarli. Secondo il Sondaggio per Sviluppatori Stack Overflow 2024, oltre il 67% degli sviluppatori incontra regolarmente problemi causati da parametri hardcodati. Questa tecnica di programmazione contraddice i principi dello sviluppo flessibile e crea seri rischi quando si sposta un'applicazione tra ambienti — da una macchina locale a un server di produzione.

Punti Chiave

  • Hardcode — valori hardcodati nel codice che dovrebbero essere parametri configurabili
  • Sicurezza compromessa: password, chiavi API e token finiscono nel controllo versione
  • Flessibilità dell'applicazione si riduce — ogni modifica richiede ricompilazione e ridistribuzione
  • Configurazione dovrebbe essere memorizzata in variabili d'ambiente, file .env o servizi esterni
  • Refactoring dell'hardcode è uno dei compiti più frequenti durante gli audit del codice in progetti commerciali

Cos'è l'hardcode in programmazione

Hardcode (codifica rigida) è un anti-pattern in cui dati, parametri di configurazione o valori vengono incorporati direttamente nel testo del programma. Invece di leggere questi valori da fonti esterne, lo sviluppatore li scrive come letterali — stringhe, numeri, valori booleani — direttamente nel corpo della funzione, classe o modulo. Il termine è nato nella comunità degli sviluppatori negli anni '80, quando il software ha iniziato a diffondersi su diverse piattaforme hardware ed è diventato evidente che i parametri hardcodati ostacolavano la portabilità.

Il problema principale dell'hardcode è che modificare qualsiasi valore di questo tipo richiede la modifica del codice sorgente, la ricompilazione e la ridistribuzione dell'applicazione. Questo rende il processo di aggiornamento lento, soggetto a errori e pericoloso — lo sviluppatore potrebbe modificare accidentalmente qualcos'altro nel codice mentre modifica un parametro hardcodato. Nelle pratiche DevOps moderne, questo approccio è categoricamente sconsigliato.

Secondo lo studio Veracode State of Software Security 2024, circa il 23% di tutte le vulnerabilità nelle applicazioni commerciali è correlato a credenziali hardcodate. Questo rende la lotta all'hardcode non solo una questione di comodità, ma un compito critico di sicurezza informatica.

Definizione di hardcode in termini semplici

Un valore hardcodato è qualsiasi numero, stringa o impostazione scritta direttamente nel codice anziché caricata dalla configurazione. Ad esempio, se uno sviluppatore scrive `connectionTimeout = 30` all'interno di una classe di connessione al database — questo è hardcode. Se legge il timeout da una variabile d'ambiente o file di configurazione — questo è l'approccio corretto.

Origine del termine

La parola hardcode deriva dal termine inglese hard code — “codice rigido.” In ambiente italiano si usano anche varianti come “codifica fissa” o “valori cablati.” A differenza delle configurazioni flessibili, l'hardcode è letteralmente “cucito” nel file eseguibile e non può essere modificato senza ricostruzione.

Perché l'hardcode è considerato una cattiva pratica

L'hardcode crea molti problemi a lungo termine. Il primo e più ovvio è l'impossibilità di modificare il comportamento dell'applicazione senza alterare il codice sorgente. Il secondo è il rischio di fuga di informazioni riservate. Il terzo è la complicazione dei test, specialmente di unità e integrazione.

In Agile e DevOps, dove è richiesto un rapido dispiegamento in diversi ambienti — sviluppo, staging, produzione — l'hardcode diventa un ostacolo insormontabile. Il team deve modificare il codice prima di ogni distribuzione o usare patch manuali, contraddicendo i principi del Continuous Delivery.

Uno studio dell'Università di Cambridge (2023) ha mostrato che i progetti con alti livelli di hardcode hanno il 47% in più di difetti al rilascio e richiedono 2,3 volte più tempo per apportare modifiche. Questo conferma che il costo di manutenzione del codice hardcodato supera significativamente il risparmio di tempo nella fase iniziale dello sviluppo.

Scalabilità e portabilità

Un'applicazione con parametri hardcodati è difficile da adattare a diverse piattaforme. Ad esempio, il percorso file `C:\Users\admin\data.txt` non funzionerà su un server Linux. E una dimensione del carattere di 14pt può apparire diversa su dispositivi con diverse densità di pixel.

Manutenibilità del codice

Quando l'hardcode è sparso in tutto il progetto, lo sviluppatore deve cercare manualmente ogni valore usando grep o la ricerca dell'IDE. Questo rallenta lo sviluppo, aumenta la probabilità di perdere un valore necessario e apre la porta a bug. Nel frattempo, un nuovo membro del team passa significativamente più tempo a comprendere i “numeri magici” e le stringhe.

Quali valori vengono hardcodati più spesso

Le password e le credenziali sono il tipo più pericoloso di hardcode. Gli sviluppatori spesso salvano password di database, chiavi API di servizi terzi e token di autorizzazione direttamente nel codice per comodità durante lo sviluppo locale, ma dimenticano di esternalizzarli prima del commit. Questo porta a fughe nei repository pubblici.

Gli URL e gli endpoint di servizi esterni sono spesso vittime dell'hardcode. Quando si cambia hosting o versione API, lo sviluppatore deve aggiornare gli URL in decine di punti. Se l'indirizzo è hardcodato in più moduli, alcuni link rimangono vecchi e l'applicazione funziona in modo errato.

I numeri magici — costanti numeriche senza spiegazione. Ad esempio, `price * 0.85` invece di `price * DISCOUNT_RATE`. Il lettore del codice non capisce cosa significhi 0,85. Questo è un classico esempio di hardcode, descritto da Martin Fowler nel suo libro “Refactoring” (1999).

Tipo di hardcodeEsempioApproccio corretto
Credenziali`password = “qwerty123”`Variabile d'ambiente
URL del server`url = “https://old-server.com/api”`File di configurazione
Timeout`setTimeout(5000)`Parametro di configurazione
Dimensioni UI`width = 320`Calcolo responsivo
Percorsi file`“./data/output.txt”`Argomento da riga di comando

Stringhe magiche

I letterali di stringa ripetuti in diverse parti del programma sono un altro tipo comune di hardcode. Ad esempio, chiavi di dizionario, intestazioni HTTP, nomi di viste in un'applicazione iOS. Se una stringa cambia in un punto ma rimane in un altro, l'applicazione si rompe. La soluzione è esternalizzare le stringhe in costanti o file di localizzazione.

Configurazione dell'ambiente

Le modalità dell'applicazione (debug/release), le impostazioni di logging, gli indirizzi dei server SMTP — tutti questi parametri devono essere esterni. Se sono hardcodati, quando si passa a un altro server l'applicazione potrebbe non avviarsi o comportarsi in modo imprevedibile.

Rischi per la sicurezza dell'hardcode

Le password e le chiavi hardcodate rappresentano una minaccia diretta per la sicurezza dell'applicazione. Se un utente malintenzionato ottiene accesso al codice sorgente (tramite fughe di repository, minacce interne o decompilazione), ottiene immediatamente accesso a tutte le risorse protette. Nel 2023, GitHub ha scoperto oltre 12 milioni di fughe di segreti in repository pubblici.

Lo standard OWASP (Open Web Application Security Project) include le credenziali hardcodate nella categoria A04:2021 — Progettazione non sicura. OWASP raccomanda di non memorizzare mai password, token o chiavi nel codice sorgente. Utilizzare invece servizi specializzati di gestione dei segreti: HashiCorp Vault, AWS Secrets Manager o Azure Key Vault.

Un audit di sicurezza condotto da Positive Technologies (2024) ha mostrato che il 78% delle applicazioni mobili testate contiene almeno una chiave o token hardcodato. Per le applicazioni web, questa cifra è del 62%. La maggior parte delle vulnerabilità può essere eliminata semplicemente esternalizzando i dati in file di configurazione.

python
# hardcoded secrets — unsafe
password = "supersecret123"
api_key = "sk-abc123def456"

# safe approach — read from env vars
import os
password = os.getenv("DB_PASSWORD")
api_key = os.getenv("API_KEY")

Fughe attraverso il controllo versione

Git preserva l'intera cronologia dei commit. Se una password hardcodata finisce in un repository, rimane nella cronologia anche dopo la rimozione dalla versione corrente. Strumenti come git-secrets e truffleHog aiutano a rilevare tali fughe, ma è meglio prevenirle nella fase di revisione del codice.

Requisiti normativi

Gli standard PCI DSS, GDPR e HIPAA vietano direttamente la memorizzazione di dati riservati nel codice sorgente. L'uso dell'hardcode può comportare conseguenze legali e multe, specialmente nei settori finanziario e sanitario.

Come evitare l'hardcode nei progetti

Il primo passo verso l'eliminazione dell'hardcode è la consapevolezza a livello di team. La revisione del codice dovrebbe includere la verifica dei valori hardcodati. Imposta un linter o analizzatore statico che evidenzi il potenziale hardcode. Per TypeScript, ESLint con la regola no-hardcoded-credentials funziona bene; per Python, Bandit.

Il secondo passo è implementare il pattern Configurazione come Codice. Tutti i parametri che possono differire tra ambienti dovrebbero essere memorizzati in variabili d'ambiente o file di configurazione. Librerie come dotenv (Node.js), python-decouple (Python) o Spring Cloud Config (Java) rendono questo approccio standard.

Il terzo passo è utilizzare servizi di gestione della configurazione: Consul, etcd, Zookeeper. Per progetti cloud, sono adatti AWS Parameter Store, Google Cloud Secret Manager o Azure App Configuration. In un'architettura a microservizi, la gestione centralizzata della configurazione è critica.

  • Variabili d'ambiente — per segreti e dati sensibili
  • File .env — per sviluppo locale
  • Classi di configurazione — con lettura da fonti esterne
  • Feature Toggles — per attivare/disattivare funzionalità
  • Internazionalizzazione — per risorse di stringhe

Migliori pratiche

Documenta ogni parametro di configurazione: il suo scopo, i valori consentiti, il valore predefinito. Utilizza la validazione dello schema per la configurazione — questo permette di rilevare errori all'avvio dell'applicazione. Crea un file .env.example con tutte le variabili necessarie ma senza valori reali.

Esempi di refactoring dell'hardcode

Consideriamo un esempio concreto in JavaScript. Prima del refactoring, il codice contiene un URL e un timeout hardcodati. Dopo il refactoring, tutti i parametri sono esternalizzati nella configurazione. Questo rende il codice testabile, flessibile e sicuro.

javascript
// before refactoring — hardcoded values
const response = await fetch("https://api.example.com/v1/users", {
  timeout: 5000,
  headers: { "Authorization": "Bearer sk-abc" }
});
javascript
// after refactoring — config driven
const config = {
  apiUrl: process.env.API_URL,
  timeout: parseInt(process.env.API_TIMEOUT || "30000"),
  authToken: process.env.AUTH_TOKEN
};

const response = await fetch(config.apiUrl, {
  timeout: config.timeout,
  headers: { "Authorization": "Bearer " + config.authToken }
});

Refactoring in Java

In Java, l'hardcode appare spesso sotto forma di stringhe di connessione al database. Usare Spring Boot con application.yml risolve questo problema: il file contiene profili per diversi ambienti e il codice legge i valori tramite l'annotazione @Value.

java
// hardcoded — Java example
class DatabaseConnection {
    private String url = "jdbc:mysql://localhost:3306/mydb";
    private String user = "admin";
    private String password = "pass123";
}

// proper config via Spring Boot
@Value("${db.url}")
private String url;

Hardcode in diversi linguaggi di programmazione

Gli approcci per combattere l'hardcode dipendono dal linguaggio e dall'ecosistema. Nei linguaggi interpretati (Python, JavaScript, Ruby), la configurazione è solitamente memorizzata in variabili d'ambiente o file .env. Nei linguaggi compilati (Java, C#, Go), è memorizzata in file di configurazione YAML, JSON, XML o risorse incorporate.

In Python, la libreria python-decouple è popolare — legge la configurazione da file .env e fornisce getter tipizzati. In Go viene utilizzato Viper — una potente libreria per lavorare con configurazioni da diverse fonti. In Swift per lo sviluppo iOS, le configurazioni sono esternalizzate in Info.plist o file di Configurazione separati.

Strumenti di analisi statica come SonarQube, ESLint, Pylint possono rilevare automaticamente i valori hardcodati. SonarQube ha regole integrate per trovare numeri e stringhe magiche nel codice di diversi linguaggi. Impostare tali controlli in una pipeline CI/CD è il modo migliore per prevenire la comparsa di nuovo hardcode.

LinguaggioMetodo di configurazioneLibreria popolare
JavaScript.env + variabili d'ambientedotenv
Python.env + ambientepython-decouple
Javaapplication.yml/propertiesSpring Cloud Config
Goconfig.yaml + envViper
SwiftConfiguration.xcconfigBuild Configuration

Automazione del rilevamento dell'hardcode

Gli hook Git pre-commit possono eseguire script che controllano i commit per segreti hardcodati. Lo strumento git-secrets scansiona i commit per corrispondenze con espressioni regolari per password, chiavi e token. TruffleHog e Gitleaks vanno oltre — controllano l'intera cronologia git per fughe.

Domande frequenti

In cosa l'hardcode si differenzia da una variabile normale?

Una variabile memorizza un valore che può cambiare durante l'esecuzione del programma. L'hardcode è un letterale scritto direttamente nel corpo della funzione o della classe che non dovrebbe cambiare senza modificare il codice sorgente. Ad esempio, `let port = 8080` all'interno di un metodo è hardcode, mentre `let port = config.port` è l'uso corretto di una variabile.

L'hardcode è sempre negativo?

Nella stragrande maggioranza dei casi — sì. Tuttavia esistono eccezioni: valori che non cambieranno garantitamente durante l'intero ciclo di vita dell'applicazione. Ad esempio, costanti matematiche (π = 3,14159) o costanti fisiche. Ma anche queste è meglio definirle come costanti nominate in modo che sia chiaro cosa significa il numero.

Come trovare tutto l'hardcode in un progetto esistente?

Usa un analizzatore statico del codice: SonarQube, ESLint con regole no-magic-numbers, Pylint con const-naming-style. Per cercare segreti — git-secrets, truffleHog o Gitleaks. Espressioni regolari per la ricerca: password dopo `password =`, URL con http/https, costanti numeriche senza nomi espliciti. Anche l'audit manuale tramite grep o ricerca nell'IDE aiuta.

Cosa sono i numeri magici e perché sono pericolosi?

I numeri magici sono letterali numerici nel codice senza spiegazione del loro significato. Ad esempio, `if (age > 18)` — il numero 18 è comprensibile, ma `if (score > 0.85)` — no. Il pericolo è che quando si modifica tale numero, lo sviluppatore potrebbe perdere uno dei punti in cui viene utilizzato. Di conseguenza, la logica del programma si rompe e il bug è difficile da tracciare.

Dovrei esternalizzare assolutamente tutti i valori nella configurazione?

No, un'eccessiva configurabilità complica il codice. La regola d'oro: esternalizza ciò che potrebbe cambiare quando cambiano l'ambiente o i requisiti. Le costanti interne che non cambiano per anni (ad esempio, i nomi dei metodi HTTP standard) possono rimanere nel codice. Segui il principio YAGNI — non aggiungere configurazione “per sicurezza.”

Riepilogo

  • Hardcode — anti-pattern in cui i dati vengono scritti direttamente nel codice anziché caricati da fonti esterne
  • Password, chiavi API e URL dovrebbero essere memorizzati in variabili d'ambiente o gestori di segreti
  • Numeri magici e stringhe rendono il codice poco chiaro e difficile da mantenere
  • Sicurezza dell'applicazione compromessa: i dati hardcodati finiscono nel controllo versione
  • Flessibilità della configurazione consente di distribuire l'applicazione in diversi ambienti senza modificare il codice
  • Analizzatori statici rilevano automaticamente l'hardcode nel codice
  • Refactoring dell'hardcode è un compito standard risolto esternalizzando i parametri in file di configurazione

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche