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

Aar*_*nLS 3 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"...
Run Code Online (Sandbox Code Playgroud)

虽然这可能应该使用权限进行管理,但是可能在同一应用程序中的另一个asp页面的上下文中可以访问其他目录,因此权限不是一个选项.

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

我希望使用Path.Combine解析路径,然后检查以确保pathCombined开始root,但Path.Combine将保持....

另外,我想在这种情况下可能会有其他类型的注入,有人可以做,所以我希望有一些更通用的东西,而不仅仅是为".. \"令牌做一个正则表达式.

arx*_*arx 5

使用System.IO.Path.GetFullPath与所有获得汇合路径\..\移除.

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

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