IIS环境下如何将文件上传保存至wwwroot外的虚拟目录?
安全合规性说明
你当前将上传文件存储在C:\inetpub\files的配置是符合安全要求的。
官方建议上传文件存放在wwwroot之外的核心逻辑是隔离站点执行目录和用户上传目录,避免上传的恶意脚本被IIS当成站点可执行文件运行。你现在的存储路径已经脱离了站点主目录wwwroot,哪怕仍在C盘也满足核心安全要求,只要额外做好两点权限配置即可:
- 给
C:\inetpub\files目录单独分配权限,仅对应当前站点的IIS应用程序池身份开放读写权限,关闭其他无关用户的访问权限 - 在IIS的
files虚拟目录配置中,将执行权限设置为「无」,同时移除该目录下所有ASP.NET托管处理程序映射,确保目录内的所有文件都只能被静态下载、无法执行
虚拟目录路径正确获取方式
绝对不能直接用env.WebRootPath + "/files"拼接路径:env.WebRootPath对应的是站点wwwroot的物理路径C:\inetpub\wwwroot,拼接出来的路径是C:\inetpub\wwwroot\files,和你实际的虚拟目录物理路径C:\inetpub\files完全不匹配。
推荐使用配置项绑定的方案实现,简单易维护:
- 在应用配置文件(如appsettings.json)中新增上传根目录配置:
{ "UploadSettings": { "FileRootPath": "C:\\inetpub\\files" } }
- 代码中注入配置对象读取路径,结合
Path.Combine拼接完整存储路径:
// 构造函数注入IConfiguration,也可提前绑定为强类型配置对象 var uploadRoot = _configuration.GetSection("UploadSettings:FileRootPath").Value; var filePath = Path.Combine(uploadRoot, document.DOCUMENT_LOCATION); var fullPath = Path.Combine(filePath, document.FILENAME_AFTER_UPLOAD);
注意:拼接路径前需要校验
document.DOCUMENT_LOCATION的内容,过滤../等路径穿越字符,避免恶意构造的路径写入非授权目录。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

