
Indice dei contenuti
Caricare una foto, un curriculum o un documento sul proprio sito sembra una funzione innocua. Eppure, ogni campo di upload apre una porta che va progettata con attenzione: un file potrebbe essere troppo grande, avere un contenuto diverso da quello dichiarato, sovrascrivere un file esistente oppure essere eseguito dal server se viene salvato nel posto sbagliato.
Non significa che ogni modulo di upload sia un pericolo imminente. Significa che non basta aggiungere un pulsante “Scegli file” e fidarsi del browser: la validazione e le protezioni devono essere implementate sul server, con limiti chiari e un flusso di gestione sicuro.
Perché il nome del file non è una garanzia 🕵️
Un file chiamato foto.jpg non è necessariamente un’immagine. Anche l’estensione e il tipo MIME dichiarato dal browser possono essere falsificati. Se il server si fida soltanto del nome o dell’header Content-Type, un attaccante può provare a caricare contenuti non previsti dall’applicazione.
La guida OWASP sugli upload raccomanda di definire tipi consentiti, verificare il contenuto lato server, imporre limiti e non usare ciecamente il nome originale. Il controllo dell’estensione è soltanto uno degli strati di difesa, non una verifica sufficiente da solo.
Definisci prima quali file servono davvero 🎯
Prima di scrivere codice, stabilisci quali formati sono necessari alla funzione. Se il modulo serve a caricare immagini del profilo, probabilmente non ha motivo di accettare archivi, file eseguibili o documenti Office.
Per ogni upload, definisci:
- le estensioni ammesse;
- la dimensione massima per singolo file;
- il numero massimo di file per richiesta o utente;
- chi può caricare file e in quali condizioni;
- chi potrà scaricarli o visualizzarli;
- per quanto tempo devono essere conservati.
Una lista di formati consentiti è generalmente più sicura di una lista di estensioni vietate: le nuove estensioni possono comparire, mentre l’applicazione conosce già quelle che le servono.
Controlla il contenuto sul server 🧪
Il browser aiuta a scegliere i file, ma non è un confine di sicurezza. I controlli che contano devono essere ripetuti sul server, prima di salvare o processare il file.
In base al caso d’uso, il server può verificare:
- l’estensione rispetto alla lista consentita;
- il tipo reale del contenuto con librerie appropriate;
- la coerenza tra estensione e formato rilevato;
- la dimensione effettiva del file;
- la validità del contenuto, per esempio che un’immagine possa essere decodificata;
- che la richiesta provenga da un utente autorizzato.
Non esiste una singola funzione di verifica che renda sicuro ogni tipo di file. La logica dipende dai formati che l’applicazione deve supportare.
Rinomina i file e non usare il nome fornito dall’utente 🏷️
Il nome originale può contenere caratteri insoliti, percorsi o informazioni personali. Invece di usarlo direttamente come nome sul disco, genera un identificativo interno, per esempio un UUID, e conserva il nome originale solo come metadato quando serve davvero.
La rinomina aiuta a evitare sovrascritture accidentali e riduce il rischio che il nome fornito dall’utente venga interpretato come parte di un percorso. In fase di download, l’applicazione può presentare il nome desiderato senza usarlo come percorso fisico sul server.
Dove conservare gli upload? 📂
Quando possibile, conserva i file fuori dalla webroot, cioè fuori dalla cartella servita direttamente dal web server. In alternativa, usa un servizio o un host dedicato allo storage, separando il più possibile l’applicazione dai file caricati.
Se per esigenze tecniche i file devono stare sotto una directory pubblica, configura il server in modo che i contenuti caricati non possano essere eseguiti come codice. La configurazione precisa dipende dal web server e dall’architettura del progetto: va verificata nell’ambiente reale, non copiata alla cieca da una guida generica.
Limita dimensioni, frequenza e consumo totale 📏
Un file può essere innocuo dal punto di vista del contenuto e diventare comunque un problema se occupa troppo spazio o viene caricato in quantità. Per questo il limite non dovrebbe fermarsi alla dimensione del singolo file.
Valuta anche:
- la dimensione massima della richiesta HTTP;
- il numero di upload per utente o intervallo di tempo;
- lo spazio complessivo assegnato a ciascun account;
- la pulizia periodica dei file temporanei e degli upload abbandonati;
- la gestione degli errori in caso di spazio esaurito.
Ricorda che il limite può dover essere configurato sia nell’applicazione sia nel reverse proxy o nel server web. Se un livello accetta richieste più grandi del successivo, l’utente potrebbe ricevere errori difficili da interpretare.
Scansione e trattamento dei documenti 🧹
Per alcuni progetti può essere utile analizzare i file con antivirus o sandbox, soprattutto quando vengono caricati documenti destinati a essere aperti da altre persone. In ambiti specifici può essere opportuno anche disarmare o ricostruire alcuni formati, ma la misura va scelta in base al rischio e alla funzione del servizio.
La scansione non è una bacchetta magica: un file che supera un controllo automatico non è automaticamente sicuro per ogni utilizzo. Mantieni aggiornati gli strumenti e non eseguire o visualizzare contenuti non fidati in contesti privilegiati.
Proteggi anche il flusso di download 🔗
La sicurezza non finisce quando il file viene salvato. Se gli upload sono privati, il download deve passare da un controllo di autorizzazione: non basta nascondere il link nell’interfaccia.
Un flusso robusto associa un identificativo applicativo al file e verifica i permessi prima di consegnarlo. Evita di costruire il percorso del file direttamente a partire da parametri inviati dal client.
Checklist per un upload più sicuro ✅
- Accetta soltanto i formati necessari al servizio.
- Verifica il contenuto lato server, senza fidarti di nome ed header.
- Imponi limiti di dimensione, frequenza e spazio complessivo.
- Genera un nome interno univoco.
- Conserva i file fuori dalla webroot o su storage separato, quando possibile.
- Verifica l’autorizzazione sia per il caricamento sia per il download.
- Previeni richieste non autorizzate e gestisci con cura i file temporanei.
- Valuta scansione e procedure aggiuntive per i documenti.
Un upload sicuro si progetta, non si improvvisa 🛡️
La funzione di upload non è solo un controllo HTML e una cartella sul server. È un piccolo flusso applicativo che comprende validazione, autorizzazioni, storage, download e manutenzione.
Se progetti ogni passaggio con limiti chiari, riduci la possibilità che un allegato diventi un problema per il sito o per i suoi utenti. E puoi continuare a ricevere file senza dover sperare che “tanto nessuno ci proverà” 🙂
