J'ai un rootPath
que j'ai confiance et un relativePath
que je n'ai pas. Je veux les combiner de telle sorte que je peux être sûr que le résultat est sous rootPath
et que l'utilisateur ne peut pas utiliser ..
pour revenir au-delà du point de départ. Je ne veulent le chemin relatif pour permettre des choses comme: hello\..\world
== world
Version sûre de Path.Combine
Répondre
Pour développer: utilisez Path.Combine, puis appelez GetFullPath sur le résultat et vérifiez que ce résultat commence par rootPath.
Il ne vous protégera pas contre les liens physiques, mais il devrait attraper des choses simples comme les points doubles.
ci-dessus 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");
}
Une chose que vous pouvez faire est de compter le nombre de barres obliques inverses (\
) et double-points (..
), et assurez-vous que le nombre de doubles points est plus petit que le nombre de barres obliques inverses. Pour dépasser la rootPath
dans votre structure de dossiers, vous aurez besoin d'au moins autant de barres obliques inverses que de doubles points. Ainsi, si vous n'autorisez que relativePath
avec au moins une barre oblique inverse, vous devriez être en sécurité.
Vous pouvez simplement appeler Path.GetFullPath()
et vérifier si elle commence par votre confiance rootPath
. Si vous avez tendance à la paranoïa, vérifiez également que rootPath
est enracinée.
public Boolean IsPathSafe(String rootPath, String relativePath)
{
return rootPath.EndsWith(Path.DirectorySeparatorChar.ToString()) &&
Path.IsPathRooted(rootPath) &&
Patch.Combine(rootPath, relativePath).GetFullPath().StartsWith(rootPath);
}
Pour une explication du premier test, voir le commentaire d'Alex Martelli sur la réponse de technophile.
- 1. Façon sûre et sûre de mettre à jour sur Internet en C#
- 2. à l'aide de la déclaration Path.Combine en C#
- 3. Pourquoi Path.Combine n'ajoute pas Path.DirectorySeparatorChar après le désignateur de lecteur?
- 4. Façade sûre/flexible pour Windows FormatMessage
- 5. Source sûre d'ajouter le dossier parent redondant
- 6. Source sûre, verrouillage exclusif sur les fichiers
- 7. C#: Cette affectation de zone est-elle sûre?
- 8. Manière sûre de changer la priorité d'un NSOperation
- 9. façon la plus sûre de créer des sessions en php
- 10. Comment accéder au contrôle C# WPF de façon sûre?
- 11. Pourquoi Path.Combine ne concatène pas correctement les noms de fichiers commençant par Path.DirectorySeparatorChar?
- 12. Saut DataContractSerializer OpenAccess Version de la version
- 13. DLL de site Web ASP.NET: version de débogage et version
- 14. Est-ce que cette façon de détecter les battements de cœur est sûre et cohérente?
- 15. AS2 Version de MovieClip.getChildByName()?
- 16. Version ASP.NET de PHPList
- 17. Version RadAjaxPanel de UpdatePanel.Update()?
- 18. Contrôle de version ASP.NET
- 19. Ancienne version de SuperWaba
- 20. version de Python
- 21. Obtention de la version
- 22. Pourquoi java -version renvoie l'ancienne version?
- 23. Obtenir la version d'Appengine version publiée
- 24. Version de production de NHibernate
- 25. Algorithme de contrôle de version
- 26. Version de recherche de Struts?
- 27. Est-ce que la mémoire de flex est sûre (sans fuite)
- 28. Est-ce que l'exposition du jeton de protection CSRF d'une session est sûre?
- 29. Migrer une base de données source sûre à SubVersion avec l'histoire
- 30. Version C# et .NET Framework Version?
J'aime: D – BCS
Cependant, si root ne se termine pas par \, c'est encore possible de jouer un tour limité - se retrouver dans un répertoire différent, un frère de la racine, qui commence avec cela comme un préfixe. Par exemple, root peut être \ zip \ zop, chemin relatif .. \ zopper \ zup, vous vous retrouvez dans \ zip \ zopper \ zup, en dehors de l'arborescence racine de \ zip \ zop mais satisfaisant toujours au test StartsWith. Petit risque, mais pas nul. –
Belle affaire de coin ... va ajouter ça au code. –