2

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

4

3 に答える 3

6

System.IO.Path.GetFullPath ?

展開するには: 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 に答える