【问题标题】:Prevent users accessing image directory contents防止用户访问图像目录内容
【发布时间】:2013-07-28 20:37:11
【问题描述】:

我正在使用 ASP.NET MVC4 创建一个站点,该站点上的功能之一是供用户上传图像。这些图像可能是个人性质的,几乎肯定包含他们孩子的图像。

图像连同其元数据一起存储在 MS Azure SQL 数据库中。为了节省 azure 上的带宽使用,一旦下载了图像,它就会保存到用户目录

~/UserImages/<Username>/<Image>

加载图库页面时,控制器操作会根据用户目录中的内容检查数据库,并删除任何不存在的内容。

目录的<Username> 部分是控制器在需要时创建的,因此我无法对其设置IIS 权限。但是,即使我是,我也不确定 IIS 能做什么,因为事先不知道用户(新注册等)。

由于 MVC 路由,用户无法通过猜测用户名来访问其他用户目录,但是如果您可以猜测用户名和图像名,那么它会显示。我正在寻找防止这种情况发生的想法,以尽量减少其他人的图像暴露给他人的机会。

我尝试了IgnoreRoute,但这不起作用。

routes.IgnoreRoute("UserImages/{*pathInfo}");

理想情况下,我会在注销时清除 UserImages 目录,但不是每个人都会使用注销命令。如果它们被清除,那么在删除文件之前找到用户名和图像名组合的可能性就会小得多。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    不如将缓存图像存储在实际站点结构中作为由 IIS 提供的静态内容,而是将图像存储在站点外部的路径中。

    这将确保未经授权的用户无法直接访问它们。

    然后您可以通过Controller(可能是UserImagesController)操作来提供对这些图像的访问权限,该操作可以验证所请求的图像是当前用户可以访问的图像。

    您的检查最终可能会像检查请求的操作的UserName 参数与您当前用户的UserName 一样简单。

    通过这种方法,您还可以控制这些图像的缓存标头、过期等。

    【讨论】:

    • 不是使用虚拟路径,而是将它们存储在本地其他地方,然后根据请求将它们复制到站点结构中?它们需要被引入到 IIS 的结构中才能为它们提供服务,因此请注意,除非它们在提供服务后立即被删除,否则请确保这可以解决问题。
    • @James 使用您的控制器和 FileResult 操作来检索和提供文件。该操作可以执行您的身份验证并将图片仅返回给正确的用户,例如 website.com/mypictures/1。
    • 没错。文件不需要物理地位于站点内。如果您的应用程序可以访问物理文件,您可以使用 FileResult 将其返回,正如@JamesSantiago 所说。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多