如果动态构建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来解析路径,然后检查以确保pathCombined
以root
开头,但Path.Combine会保留.... \
此外,我想在这种情况下可能会有其他类型的注射,有人可以做,所以我希望有一些更通用的东西,而不仅仅是为“.. \”代币做正则表达式。
答案 0 :(得分:5)
使用System.IO.Path.GetFullPath
获取已删除所有\..\
的合并路径。
然后检查路径是否仍然以预期的前缀开始。
你应该将它放在异常处理程序中(如果异常会导致问题); GetFullPath
将访问文件系统(对于存在的路径),如果您的恶意客户端创建指向无法访问的文件夹的路径,您将获得异常。