验证UNC路径(防止\ .. \ .. \和类似注入)

3

如果动态构建UNC路径以将其限制为特定根路径,应使用哪些技术?

string root = @"\\Blah\Share\YouStayHere\";

//pretend second string is from a query string a user could manipulate
string path = @"\\Blah\Share\YouStayHere\" + @"..\..\TresspassingQueryString";

if( ! SomeValidation(root, path) ) { throw new Exception("you dirty bastard"...

虽然可能应该通过权限来管理这个问题,但也许在同一应用程序中的另一个ASP页面的上下文中可以访问其他目录,因此权限不是选项。

我知道Request.MapPath可以用于保持对应用程序目录的访问,但这是.NET应用程序虚拟路径外的共享。

我希望使用Path.Combine来解决路径问题,然后检查确保pathCombinedroot开头,但Path.Combine将继续保留....\

此外,我想象中还可能有其他类型的注入,所以我希望有比仅对"..\"令牌进行正则表达式更通用的方法。

1个回答

5

使用System.IO.Path.GetFullPath获取已删除所有\..\的组合路径。

然后检查该路径是否仍以预期前缀开头。

如果异常会导致问题,应将此代码放在异常处理程序中;对于存在的路径,GetFullPath将访问文件系统,如果您的恶意客户端创建了指向无法访问的文件夹的路径,将引发异常。


1
我可能还会确保即使是一个有效的路径,但是越过了根目录,那么我会确保任何错误消息都是模棱两可的。也就是说,你不希望有一个消息说“这是一个无效的路径”,另一个错误消息说“这是一个受限区域”,因为第二个错误消息告诉他们他们猜对了一个真实的路径,从而给他们关于文件结构的信息。 - AaronLS

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