私にはrootPath
信頼できるものと信頼relativePath
できないものがあります。rootPath
結果が下にあり、ユーザーが..
開始点を超えて戻ることができないように、それらを組み合わせたいと思います。相対パスで次のようなことができるようにしたい:hello\..\world
==world
質問する
967 次
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 に答える