【问题标题】:How to secure user uploaded files如何保护用户上传的文件
【发布时间】:2014-02-11 19:06:02
【问题描述】:

我有 asp mvc 项目。我在其中添加了目录结构:

...
  UserUploads
    User_1
      Images
        Original
        Thumb
        Display
    User_2
    User_n
...

如何使这个文件夹结构对用户不可见?我不希望未经授权的用户通过输入 url 看到这些图像。每个用户都有自己的图像,只有某个用户的“朋友”用户才能看到它的图像。我检查了 facebook 图片,图片地址如下:

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-ash4/296040_2530953916384_1329592446_32898884_1499197273_n.jpg

那么,确保用户上传文件安全的最佳做法是什么?

【问题讨论】:

    标签: asp.net-mvc security architecture file-upload


    【解决方案1】:

    嗯,你可以使用 2 种方法:

    1. 真正的安全性 - 完全限制对文件夹结构的访问,并且只使用一些 HttpHandler(或 MVC 操作)来为它们提供服务(在评估访问权限后,通过 TransferFile 或流写入器将它们写入响应......)。从性能的角度来看,这非常糟糕 - 没有缓存、每张图片的整个服务器端处理等等。

    2. “混淆”安全性 - 只需生成无法猜测的文件名(Guid 是很好的候选者),因此没有访问将其文件名生成为 HTML 的页面的任何人都无法直接访问它们。当然,如果一个“朋友”访问它,然后将文件 URL 提供给未经授权的人,但他可以轻松地将文件本身发送给他......这样性能非常好 - 文件是可缓存的(通过 IIS 和客户端),您的应用不必处理对图像等的请求。

    【讨论】:

    • 以文件名作为 GUID 是个好主意。因此,网络上的图像无法完全保护。现在我在 Facebook 上为我的朋友拍照并注销,我可以访问该图像。有线,但如果适用于 fb,它也适用于我。
    • 我也使用 GUID 作为文件名,与 db 中的真实路径保持关联。每次请求文件时,我都会将 GUID 转换为服务器端路径,访问文件并提供它,而不显示上传路径(实际上是在 IIS 内容域之外)。
    • 如果用户通过 Windows 身份验证,真正的安全也可以基于 ACL。
    • 请不要使用混淆作为安全方法。
    【解决方案2】:

    只需在 web.config 文件中限制对该 UserUploadsFolder 的访问:

    <location path="UserUploads">
        <system.web>
            <authorization>
                <deny users="*"/>
            </authorization>
        </system.web>
    </location>
    

    【讨论】:

    • 但是当一些用户登录到应用程序时,他就被授权了。他能看到它的图像吗?然后他可以看到某个图像的路径,然后他可以猜出另一个图像的路径?我说的对吗?
    • 不,如果你输入 deny = * - 除了你的应用程序之外没有人会看到图像
    • 这仅在 runAllManagedModulesForAllRequests 设置为 true 时为 true。直接文件请求不通过 asp.net 管道。
    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多