Ricevere file dagli utenti è un sistema comodo, ma se non progettato correttamente può portare a vulnerabilità gravi. Gli attaccanti possono sfruttare il caricamento per eseguire codice arbitrario, esaurire la capacità del server e distribuire file non autorizzati.
Le minacce principali sono le seguenti:
La base delle contromisure è la "difesa multilivello". È efficace progettare senza dipendere da una singola misura di protezione, sovrapponendo più strati di difesa.
Limitare le estensioni consentite e decidere se accettare o meno un file non solo in base all'estensione. Controllare la firma del file (magic number) per verificarne il contenuto. Non fidarsi dell'intestazione Content-Type e implementare meccanismi per prevenire metodi di bypass come doppie estensioni e byte NULL.
Non salvare il nome del file fornito dall'utente così com'è. Sostituirlo con un nome univoco utilizzando UUID o hash + timestamp e salvare il nome originale come metadato separato. Gestire anche caratteri speciali e limiti di lunghezza.
È importante salvare i file caricati fuori dalla root web per evitare che vengano eseguiti direttamente. Se possibile, salvare in uno storage oggetti dedicato (es.: S3) e generare un link di download tramite l'app. Limitare i permessi di lettura e scrittura della cartella di salvataggio, senza concedere diritti di esecuzione.
Impostare un limite massimo per la dimensione dei file e introdurre un controllo sul numero di caricamenti simultanei e sulla velocità per garantire la disponibilità del servizio. Se vengono accettati file compressi (ZIP, ecc.), è necessario controllare anche ciascun file dopo l'estrazione.
Eseguire una scansione antivirus immediatamente dopo il caricamento (possibilmente utilizzando più motori) e disarmare file PDF/Office tramite CDR (Content Disarm & Reconstruct). È efficace ripristinare le immagini tramite re-encoding (lettura → generazione di un nuovo file) per rimuovere dati non autorizzati incorporati.
Assicurarsi che le comunicazioni siano sempre protette via TLS (HTTPS) e implementare contromisure come i token CSRF. Aggiungere l'intestazione Content-Disposition: attachment
e X-Content-Type-Options: nosniff
alle risposte di download per prevenire malfunzionamenti del browser.
Tenere un registro dettagliato di chi ha gestito quali file e quando, impostando avvisi per comportamenti anomali (caricamenti frequenti o un numero elevato di rifiuti). Mantenere hash per l'integrità dei file è anche utile.
Dopo l'implementazione, eseguire test di vulnerabilità specifici per il caricamento di file (inserimento di shell, bypass delle estensioni, path traversal, ecc.) e rivedere periodicamente.
Qui presentiamo UploadF (uploadf.com), un servizio che supporta sia PC che smartphone, offre drag & drop e consente il caricamento simultaneo di 100 file, ma che presenta anche alcune considerazioni e accorgimenti da tenere in mente nella progettazione del servizio.
Elemento di controllo | Punti da attuare / confermare |
---|---|
Limitazione della whitelist delle estensioni | Consentire solo i formati necessari. Utilizzare la blacklist come misura ausiliaria. |
Controllo MIME / firma | Verifica se l'estensione e il contenuto corrispondono (controllo del magic number). |
Rinominazione dei file | Sostituire con UUID o nomi hash e gestire il nome originale come metadato. |
Rimozione dei caratteri speciali | Rimuovere o rifiutare caratteri come `/`, `\`, `..`, NULL, ecc. |
Directory di salvataggio | Salvare al di fuori della root web o in uno storage oggetti. |
Permessi di cartella | Divieto di esecuzione, permessi minimi di lettura e scrittura (principio del minimo privilegio). |
Dimensioni massime/minime dei file | Chiarire il limite e controllare i file dopo l'estrazione da ZIP e altri. |
Controllo dei caricamenti simultanei | Limitare il numero di parallelismi, controllare la velocità e impostare timeout. |
Scansione virus / CDR | Eseguire scansioni immediate e trattamenti di disarmamento necessari. |
Crittografia delle comunicazioni (HTTPS) | Rendere obbligatorio l'uso di TLS (per prevenire attacchi man-in-the-middle). |
Contromisure CSRF | Implementare controlli basati su token. |
Impostazione delle intestazioni di risposta | Aggiungere Content-Disposition: attachment , X-Content-Type-Options: nosniff , ecc. |
Registrazione e avvisi | Audit dei comportamenti di caricamento e notifiche in caso di anomalie. |
Revisione della sicurezza periodica | Eseguire test di vulnerabilità e penetrazione regolarmente. |
Cancellazione automatica dei file obsoleti | Progettazione per la cancellazione completa dopo la scadenza di conservazione. |
Controllo degli accessi / autorizzazione | Gestire rigidamente i diritti di accesso per unità utente / gruppo. |
Le funzionalità di caricamento dei file presentano sia comodità che rischi. Integrare le difese multilivello (whitelist, controllo delle firme, separazione delle posizioni di salvataggio, misure anti malware, audit dei registri, ecc.) nel design ridurrà significativamente il rischio di attacchi.
È importante esprimere agli utenti che il servizio è "facile da usare e sicuro". Ad esempio, servizi come UploadF (uploadf.com), che offrono funzionalità di gestione come la cancellazione individuale e la configurazione dei periodi di conservazione, possono fornire un maggiore senso di sicurezza.
※ Le fonti sopra riportate sono esempi al momento della redazione dell'articolo. Si prega di consultare la documentazione ufficiale per materiali di implementazione più dettagliati o informazioni sulle minacce più recenti.