2009-04-29 7 views
2

Ich habe eine rootPath, die ich vertraue, und eine relativePath, die ich nicht. Ich möchte sie so kombinieren, dass ich sicher sein kann, dass das Ergebnis unter rootPath liegt und der Benutzer .. nicht verwenden kann, um über den Startpunkt hinaus zu gelangen. Ich tun der relative Pfad wollen die Dinge ermöglichen, wie: hello\..\world == worldSichere Version von Path.Combine

Antwort

5

System.IO.Path.GetFullPath?

Um zu erweitern: Verwenden Sie Path.Combine, dann rufen Sie GetFullPath auf das Ergebnis und überprüfen Sie, dass das Ergebnis mit RootPath beginnt.

Es schützt Sie nicht vor Hardlinks, aber es sollte einfache Dinge wie Doppelpunkte fangen.

die oben als Code:

string Resolve(string fileName) 
{ 
    string root = FileRoot(); 
    string ret = Path.GetFullPath(Path.Combine(root, fileName)); 
    if (ret.StartsWith(root.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar)) return ret; 
    throw new ArgumentException("path resolved to out of accesable directroy"); 
} 
+0

Ich mag es: D – BCS

+3

Allerdings, wenn Root nicht mit endet, ist es immer noch möglich, einen begrenzten Trick zu spielen - Ende in einem anderen Verzeichnis, ein Geschwister der Wurzel, die damit als Präfix beginnt. Z. B. root könnte \ zip \ zop, relativer Pfad .. \ zopper \ zup sein, Sie landen in \ zip \ zopper \ zuup, außerhalb des Baumes, der in \ zip \ zop verwurzelt ist, aber immer noch den StartsWith-Test erfüllt. Kleines Risiko, aber nicht Null. –

+1

Schöne Ecke Fall ... werde das zum Code hinzufügen. –

-1

Eine Sache, die Sie tun können, ist die Anzahl der Schrägstriche (\) und Doppelpunkte (..) zu zählen, und stellen Sie sicher, dass die Zahl von Doppelpunkten ist kleiner als die Anzahl der umgekehrten Schrägstriche. Um über die rootPath in Ihrer Ordnerstruktur zu gehen, benötigen Sie mindestens so viele Backslashes wie doppelte Punkte - wenn Sie also nur relativePath s mit mindestens einem weiteren Backslash zulassen, sollten Sie sicher sein.

+0

aber \ .. \ .. \ this \ goes \ wer \ bekannt \ wo – BCS

+0

Ich denke, Sie am Ende müssen eine laufende Zählung zu halten – BCS

2

könnten Sie rufen Path.GetFullPath() und überprüfen, ob es mit Ihrem vertrauenswürdigen rootPath beginnt. Wenn Sie zur Paranoia neigen, überprüfen Sie auch, dass rootPath verwurzelt ist.

Für eine Erläuterung des ersten Tests siehe Alex Martellis Kommentar zur Antwort von technophile.

Verwandte Themen