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);
}

除了输入是网站目录上方path的相对路径时,这通过了我的所有测试。

例如,给定一个currentFileDirectoryof~/foo/bar和一个相对路径,../../../我想检测到这个并尝试修复路径。

4

2 回答 2

1

Server.MapPath 是一种验证虚拟或 dos 样式路径的简单方法。出于安全原因,验证被限制验证网站外部的任何物理路径。请参阅我上面的评论。

于 2012-11-29T20:59:46.687 回答
0

为了详细说明 Mike 的回答,我们可以通过以下方式验证相对路径是否尝试超出物理网站目录:

  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 回答