Die sichere version von Path.Kombinieren
-
03-07-2019 - |
Frage
Ich habe eine rootPath
dass ich Vertrauen und eine relativePath
das weiß ich nicht.Ich möchte Sie zu kombinieren in einer Weise, dass kann ich mir sicher sein, dass das Ergebnis unter rootPath
und, dass die Benutzer nicht verwenden können ..
um wieder Vergangenheit der Ausgangspunkt.Ich do möchten Sie den relativen Pfad zu erlauben, Dinge wie: hello\..\world
== world
Lösung
Zu erweitern:verwenden Sie Path.Kombinieren, dann rufen Sie GetFullPath auf das Ergebnis und überprüfen Sie, dass das Ergebnis beginnt mit rootPath.
Es wird nicht schützen Sie gegen harte, aber sollte es zu fangen einfachen Sachen wie Doppel-Punkten.
zu den oben genannten 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");
}
Andere Tipps
Sie könnten nur Path.GetFullPath()
anrufen und überprüfen, ob es mit Ihrem vertrauenswürdigen rootPath
beginnt. Wenn Sie zu Paranoia neigen, überprüfen Sie auch, dass rootPath
verwurzelt ist.
public Boolean IsPathSafe(String rootPath, String relativePath)
{
return rootPath.EndsWith(Path.DirectorySeparatorChar.ToString()) &&
Path.IsPathRooted(rootPath) &&
Patch.Combine(rootPath, relativePath).GetFullPath().StartsWith(rootPath);
}
Für eine explaination des ersten Tests sieht Alex Martelli Kommentar auf technophile Antwort.
Eine Sache, die Sie tun können, ist die Anzahl der Schrägstriche (\
) und Doppelpunkte (..
) zu zählen, und stellen Sie sicher, dass die Anzahl der Doppelpunkte kleiner ist als die Anzahl der Schrägstriche. Um über dem rootPath
in Ihrer Ordnerstruktur zu gehen, werden Sie mindestens so viele Schrägstriche als Doppelpunkte müssen - also, wenn Sie relativePath
s mit mindestens einem weiteren Backslash erlauben, sollten Sie sicher sein