Evitare problemi di path canonicalization con ASP.NET

di Daniele Bochicchio, in ASP.NET, Security,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi