Quando si sviluppa un'applicazione web è molto importante fare attenzione ai parametri, specie se le informazioni che vengono inserite all'interno di questi ultimi servono per costruire variabili da utilizzare per lavorare su path locali.
In questi casi è ad esempio abbastanza diffuso un codice del genere:
string filePath = string.Concat(basePath, myPath);
In questo scenario, senza nessun controllo, supponendo che basePath sia uguale a "c:\sito\" e myPath a "..\..\windows\cmd.exe", l'effetto è quello di poter arrivare ad un percorso come "c:\windows\cmd.exe", con conseguenze che in alcuni casi possono essere anche molto gravi.
Questa mancanza di controllo prende il nome di path canonicalization e si può risolvere in diversi modi.
Quello utilizzato di seguito consiste nel cercare nel path passato attraverso una variabile uno dei caratteri non ammessi all'interno di un nome di file, per poi verificare opportunamente, dopo aver usato il metodo statico Combine della classe Path, se il path risultante contiene ancora il percorso iniziale nella prima parte:
if (myPath.IndexOfAny(Path.GetInvalidFileNameChars()) >-1) throw new FileNotFoundException("FileName not valid"); string filePath = Path.Combine(basePath, myPath); if (!filePath.StartsWith(basePath)) throw new FileNotFoundException("Path not valid");
Supponendo che basePath e myPath abbiano gli stessi valori del primo esempio, il primo controllo avrà l'effetto di bloccare l'esecuzione e comunque il risultato contenuto in filePath sarebbe "c:\windows\cmd.exe", che non soddisfa ovviamente la seconda istruzione, scatenando comunque un'eccezione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Implementare il throttling in ASP.NET Core
Short-circuiting della Pipeline in ASP.NET Core
Load test di ASP.NET Core con k6
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Migrare una service connection a workload identity federation in Azure DevOps