0

次の関数を使用して、パスを有効な仮想パスに変換しています。

public string GetFullPath(string path)
{
    Ensure.Argument.NotNullOrEmpty(path, "path");

    if (path[0] == '~') // a virtual path e.g. ~/assets/style.less
    {
        return path;
    }

    if (VirtualPathUtility.IsAbsolute(path)) // an absolute path e.g. /assets/style.less
    {
        return VirtualPathUtility.ToAppRelative(path,
            HostingEnvironment.IsHosted ? HostingEnvironment.ApplicationVirtualPath : "/");
    }

    // otherwise, assume relative e.g. style.less or ../../variables.less
    return VirtualPathUtility.Combine(VirtualPathUtility.AppendTrailingSlash(currentFileDirectory), path);
}

これは、入力がWebサイトディレクトリのpathの相対パスである場合を除いて、すべてのテストに合格します。

たとえば、のと相対パスがcurrentFileDirectory与えられた場合、これを検出してパスを修正しようとします。~/foo/bar../../../

4

2 に答える 2

1

Server.MapPathは、仮想パスまたはdosスタイルのパスを検証する簡単な方法です。検証は、セキュリティ上の理由から、Webサイトの外部にある物理パスを検証することを制限されています。上記の私のコメントを参照してください。

于 2012-11-29T20:59:46.687 に答える
0

マイクの答えを詳しく説明するために、相対パスが物理Webサイトディレクトリの外に出ようとするかどうかを検証できます。

  1. を使用して現在のパスと相対パスの結合パスを取得するPath.GetFullPath
  2. を使用して試行されたパスのファイルシステムパスを取得するServer.MapPath
  3. アプリケーションのルートのファイルシステムパスを取得する
  4. 試行されたパスがルートパス内に存在することを検証します

例:

var currentFileDirectory = "~/foo/bar";
var relativePath = "../../../";
var attemptedPath = Path.GetFullPath(Path.Combine(Server.MapPath(currentFileDirectory), relativePath)); // 1 + 2
var rootPath = Server.MapPath("~/"); // 3

if (attemptedPath.IndexOf(rootPath, StringComparison.InvariantCultureIgnoreCase) == -1) // 4
{
    throw new Exception(string.Format("Path {0} is outside path {1}", 
        rootPath, HostingEnvironment.ApplicationPhysicalPath));
}
于 2012-11-29T21:27:23.683 に答える