我有以下场景(C#,WinForms)。我有一些项目文件保存在某个目录中。项目文件包含对另一个文件的引用。此引用与保存项目文件的位置相关。
示例:项目文件保存在c:\ projects \ project.xyz下。另一个文件被引用为“\ someotherdir \ file.abc”。
这样可以正常工作,但可能有人试图操纵相对路径,例如“.. \ Windows \ System32 \ file.abc”。因此需要检查相对路径是否指向保存项目的路径之外(这是一个已定义的要求,所有引用的文件都在项目路径中)。
如何检测此方案?
答案 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.dll
。 System.IO.Path.GetFullPath()
在这里工作吗?
POSIX也支持硬链接。文件可以为零(删除时),一个,两个,十个,一百个文件名。所有都是“文件名”,没有比其他任何更正确或更不正确。
Windows支持将文件夹挂载到文件夹中。同样,所有名字都是正确的。
您可以使用文件系统权限解决此问题:为您的应用程序创建新用户。授予该用户对项目路径的权限。不要将该用户(或每个人或用户所属的任何组)的权限授予任何文件系统中的任何其他用户。让微软的内核团队为您解决问题。