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

War es hilfreich?

Lösung

System.IO.Path.GetFullPath?

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 relativePaths mit mindestens einem weiteren Backslash erlauben, sollten Sie sicher sein

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top