如果动态构建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将保持....
另外,我想在这种情况下可能会有其他类型的注入,有人可以做,所以我希望有一些更通用的东西,而不仅仅是为".. \"令牌做一个正则表达式.
使用System.IO.Path.GetFullPath
与所有获得汇合路径\..\
移除.
然后检查路径是否仍以预期的前缀开头.
你应该将它放在异常处理程序中(如果异常会导致问题); GetFullPath
将访问文件系统(对于存在的路径),如果您的恶意客户端创建指向无法访问的文件夹的路径,您将获得异常.