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
== world
Sichere Version von Path.Combine
Antwort
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");
}
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.
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.
- 1. \ in path.combine in C#
- 2. Sichere Durchsetzung von Benutzereingabedateipfaden innerhalb von Unterverzeichnissen
- 3. Path.Combine und die Punktnotation
- 4. So rufen Sie Path.Combine von MSBuild auf?
- 5. sichere Art und Weise alte Version von Python zu deinstallieren
- 6. Path.Combine absolute mit relativen Pfadzeichenfolgen
- 7. Problem Path.Combine Anweisung in C#
- 8. Path.Combine für URLs (Teil 2)
- 9. Warum reagiert IIS auf eine sichere (SSL-) Seitenanforderung mit einer 302 auf seine nicht sichere Version?
- 10. Path.Combine() wird nicht wie erwartet funktioniert
- 11. Möglicher Grund von Path.Combine einen der Parameter auslassen
- 12. Sichere Verwendung von Javas SecureRandom
- 13. Sichere Dateierweiterungen
- 14. Sichere Webtextformatierung
- 15. sichere Benutzerauthentifizierung ohne Javascript
- 16. Warum fügt Path.Combine die Path.DirectorySeparatorChar nicht nach dem Laufwerksbezeichner hinzu?
- 17. Gibt es eine Path.Combine für Registrierungsschlüsselpfade in .net?
- 18. Warum verkettet Path.Combine nicht korrekt Dateinamen, die mit Path.DirectorySeparatorChar beginnen?
- 19. ASP.NET MVC - Sichere temporäre Speicherung von Kreditkartendaten
- 20. Signal sichere Verwendung von sem_wait()/sem_post()
- 21. Sichere Java-Programm von dekompilierten wird
- 22. Sichere Bereitstellung von Java-Krieg-Anwendungen
- 23. sichere ios app von hack - objec-c
- 24. Sichere Web API von Xamarin.Ios nicht funktioniert
- 25. Sichere Nutzung von glMapBufferRange() auf Android/Java
- 26. Frühling Stiefel sichere Rest von Netzwerk
- 27. Thread-sichere Implementierung von Builder-Muster
- 28. Programmierbare, sichere FTP-Ersetzung
- 29. Thread-sichere einheitliche Zufallszahlengenerator
- 30. Wie funktioniert sichere Tastatursoftware?
Ich mag es: D – BCS
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. –
Schöne Ecke Fall ... werde das zum Code hinzufügen. –