私にはrootPath信頼できるものと信頼relativePathできないものがあります。rootPath結果が下にあり、ユーザーが..開始点を超えて戻ることができないように、それらを組み合わせたいと思います。相対パスで次のようなことができるようにしたい:hello\..\world==world
3 に答える
6
展開するには: Path.Combine を使用してから、結果に対して GetFullPath を呼び出し、その結果が rootPath で始まることを確認します。
ハードリンクから保護することはできませんが、ダブルドットなどの単純なものをキャッチする必要があります.
上記をコードとして:
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");
}
于 2009-04-29T23:31:06.760 に答える
2
Path.GetFullPath()信頼できる で始まるかどうかを呼び出すだけで確認できますrootPath。パラノイアになりがちな場合は、rootPath根ざしていることも確認してください。
public Boolean IsPathSafe(String rootPath, String relativePath)
{
return rootPath.EndsWith(Path.DirectorySeparatorChar.ToString()) &&
Path.IsPathRooted(rootPath) &&
Patch.Combine(rootPath, relativePath).GetFullPath().StartsWith(rootPath);
}
最初のテストの説明については、技術愛好家の回答に対する Alex Martelli のコメントを参照してください。
于 2009-04-29T23:33:15.397 に答える
-1
できることの1つは、円記号(\)と円記号()の数を数え、円記号..の数が円記号の数よりも少ないことを確認することです。フォルダ構造で上に移動するにはrootPath、少なくとも2つの円記号と同じ数の円記号が必要です。したがって、relativePath少なくとも1つ以上の円記号を含むsのみを許可する場合は、安全である必要があります。
于 2009-04-29T23:26:10.170 に答える