我正在使用以下函数将路径转换为有效的虚拟路径:
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
是相对路径 网站目录之外,这传递了我的所有测试。
例如,如果currentFileDirectory
为~/foo/bar
且相对路径为../../../
,我想检测此情况并尝试修复路径。
答案 0 :(得分:1)
Server.MapPath是验证虚拟路径或dos样式路径的简便方法。出于安全原因,验证受限于验证网站外的任何物理路径。请参阅上面的评论。
答案 1 :(得分:0)
为了详细说明迈克的回答,我们可以通过以下方式验证相对路径是否试图超出物理网站目录:
Path.GetFullPath
Server.MapPath
示例:
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));
}