如何确定相对路径是否指向给定路径之外

时间:2010-06-28 10:46:56

标签: c# winforms

我有以下场景(C#,WinForms)。我有一些项目文件保存在某个目录中。项目文件包含对另一个文件的引用。此引用与保存项目文件的位置相关。

示例:项目文件保存在c:\ projects \ project.xyz下。另一个文件被引用为“\ someotherdir \ file.abc”。

这样可以正常工作,但可能有人试图操纵相对路径,例如“.. \ Windows \ System32 \ file.abc”。因此需要检查相对路径是否指向保存项目的路径之外(这是一个已定义的要求,所有引用的文件都在项目路径中)。

如何检测此方案?

3 个答案:

答案 0 :(得分:4)

您可以尝试使用以下扩展方法:

public static bool IsChildOf(this string path, string parentPath)
{
    return Path.GetFullPath(path).StartsWith(Path.GetFullPath(parentPath),
           StringComparison.InvariantCultureIgnoreCase);
}

答案 1 :(得分:2)

不是很漂亮,但我认为它应该有用。

if (System.IO.Path.GetFullPath(path).IndexOf(projectPath, StringComparison.CurrentCultureIgnoreCase) == -1)
{
  // naughty
}

编辑成为一名优秀的全球公民。

答案 2 :(得分:1)

Windows有posix符号链接:ln -s c:\windows\system32\mshtml.dll c:\projects\project.xyz\innocent.txt。当您的计划开启c:\projects\project.xyz\innocent.txt时,您会获得c:\windows\system32\mshtml.dllSystem.IO.Path.GetFullPath()在这里工作吗?

POSIX也支持硬链接。文件可以为零(删除时),一个,两个,十个,一百个文件名。所有都是“文件名”,没有比其他任何更正确或更不正确。

Windows支持将文件夹挂载到文件夹中。同样,所有名字都是正确的。

您可以使用文件系统权限解决此问题:为您的应用程序创建新用户。授予该用户对项目路径的权限。不要将该用户(或每个人或用户所属的任何组)的权限授予任何文件系统中的任何其他用户。让微软的内核团队为您解决问题。