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
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Fissare una versione dell'agent nelle pipeline di Azure DevOps
Escludere alcuni file da GitHub Secret Scanning
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
Il nuovo controllo Range di Blazor 9