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

时间:2012-01-20 22:35:27

标签: c# security

如果动态构建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 个答案:

答案 0 :(得分:5)

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

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

你应该将它放在异常处理程序中(如果异常会导致问题); GetFullPath将访问文件系统(对于存在的路径),如果您的恶意客户端创建指向无法访问的文件夹的路径,您将获得异常。