#924 - Evitare problemi di path canonicalization con ASP.NET

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.


Approfondimenti

Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

Per inserire un commento, devi registrarti alla nostra community.




IN EVIDENZA
MISC