Asp.net 将虚拟目录映射到App_数据中用于提供图像的子文件夹是否安全?

Asp.net 将虚拟目录映射到App_数据中用于提供图像的子文件夹是否安全?,asp.net,asp.net-mvc-3,iis-7,Asp.net,Asp.net Mvc 3,Iis 7,我正在IIS7下运行一个mvc3应用程序 公众可以通过文件上载控件上载图像,该控件调整图像大小,然后将图像写入App_数据文件夹的子文件夹 当涉及到在页面上显示上传的图像时,我不能直接从App_数据子文件夹中提供这些图像,因为出于安全原因,IIS7将其限制为受保护的文件夹 如果我将一个虚拟目录映射到App_数据子文件夹,我可以为其中存储的图像提供服务,但这就提出了一个问题——这会带来安全风险吗 据我所知,只要在虚拟目录上设置了正确的权限,就应该可以了 这是正确的吗?还是我忽略了其他的东西 据我所

我正在IIS7下运行一个mvc3应用程序

公众可以通过文件上载控件上载图像,该控件调整图像大小,然后将图像写入App_数据文件夹的子文件夹

当涉及到在页面上显示上传的图像时,我不能直接从App_数据子文件夹中提供这些图像,因为出于安全原因,IIS7将其限制为受保护的文件夹

如果我将一个虚拟目录映射到App_数据子文件夹,我可以为其中存储的图像提供服务,但这就提出了一个问题——这会带来安全风险吗

据我所知,只要在虚拟目录上设置了正确的权限,就应该可以了

这是正确的吗?还是我忽略了其他的东西

据我所知,只要在虚拟目录上设置了正确的权限,就应该可以了

没错。如果您确保只有授权用户才能访问此虚拟目录,那么您的文件将非常安全

但是,为了避免创建另一个虚拟目录的所有麻烦,您可以创建一个控制器操作,该操作将直接为来自此文件夹的文件提供服务:

// You could specify Roles instead of Users if you wish
[Authorize(Users = "john, jane")] 
public ActionResult AppDataFile(string filename)
{
    var file = Path.Combine(Server.MapPath("~/app_data"), filename);
    if (!System.IO.File.Exists(file))
    {
        return HttpNotFound();
    }
    return File(file, "application/octet-stream", Path.GetFileName(file));
}

然后,当您以
jane
身份进行身份验证时,您可以
/appdatafile?filename=foo.bar
App\u Data
文件夹下载foo.bar文件。

我更关心的是App\u数据文件夹以及web应用程序标识可以写入其中的事实。我想知道这些权限是否可以通过虚拟目录隐式传递。在上面的场景中-这是否仍然像静态文件一样在用户浏览器中缓存文件?@Baldy,通过使用Response.cache对象并设置适当的头,您可以完全控制缓存的内容。