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

3
我有以下情况(C#,WinForms)。 我有某种项目文件保存在某个目录中。 项目文件包含对另一个文件的引用。 此引用相对于保存项目文件的位置。
示例:项目文件保存在c:\ projects \ project.xyz下。 其他文件被引用为“\ someotherdir \ file.abc”。
这很好用,但有可能有人尝试将相对路径操纵为“.. \ Windows \ System32 \ file.abc”之类的东西。 因此,有必要检查相对路径是否指向项目所保存的路径之外(已定义要求,所有引用的文件都在项目路径内)。
如何检测这种情况?

1
这也是我的第一个想法。但是另一位开发人员提出了这样的论点:"\someotherdir..\someotherdir\file.abc" 这样的路径是正确的。虽然这并没有太多意义。 - Michael
3个回答

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

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

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

这个解决方案有一个问题,进一步的测试已经显示出来: 当父路径类似于:“C:\dir1\dir2\test”,而路径类似于:“C:\dir1\dir2\test..\test.abc”时,GetFullPath返回“C:\dir1\dir2\test.abc”,这应该返回false,因为文件在父路径的上一级。但是它返回true,因为StartsWith... - Michael
@Michael:在将其转换为绝对路径后,使用 Path.GetDirectoryName 仅获取您正在测试的文件的目录部分。 - Hans Olsson
我已经进行了更改,这只是为其他读者提供信息。此外,在这种情况下还有更多要检查的事项,以使其真正安全,但这超出了本问题的范围。 - Michael

2

虽然不太美观,但我认为它应该能工作。

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

编辑以成为良好的全球公民。


3
不要使用 ToUpper/ToLower 来实现大小写不敏感的字符串比较,因为这种方法无法通过 Turkey Test。可以使用其中一种带有 StringComparison 参数的 String.IndexOf 重载方法来进行比较。 - dtb
请使用Path.GetDirectoryName(projectPath)代替projectPath。 - Denis Palnitsky
1
对于那些不熟悉“火鸡测试”是什么的人,请参考以下链接:http://www.codinghorror.com/blog/2008/03/whats-wrong-with-turkey.html - Dirk Vollmar
@dtb:是的,我太习惯只用英国的应用了,从来不用担心这个问题。 - Hans Olsson
@Orsol:我指的是projectPath作为目录路径而不是实际项目文件的路径,也许应该更清楚一些。 - Hans Olsson

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.dll。在这里System.IO.Path.GetFullPath()有效吗?

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

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

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


很好知道,但在我们的情况下,用户可能会在不同位置拥有多个项目。因此,应用程序需要为每个项目设置该特定用户的权限,这将要求应用程序以管理员权限运行,这并不是一个好的解决方案。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接