如何保护用户上传的文件

3

我有一个 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

那么,如何最好地保护用户上传的文件安全呢?
2个回答

5

你可以采用以下两种方法:

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

  2. "混淆"安全性 - 简单地生成无法被猜测的文件名(Guid是很好的选择),因此没有访问将生成其文件名到HTML的页面的人可以直接访问它们。当然,如果一个“朋友”访问它,然后将文件URL发送给未经授权的人,但他同样可以轻松地向他发送文件本身... 这样性能非常好 - 文件可缓存(由IIS和客户端缓存),您的应用程序不必处理图像请求等。


将文件名设为GUID是个好主意。这样网上的图片就无法完全保护了。现在我拿到了我朋友在Facebook上的照片,退出登录后仍然可以访问。虽然有些奇怪,但如果对Facebook有效,那对我也有效。 - 1110
我也使用 GUID 作为文件名,并将其与实际路径在数据库中进行关联。每次请求文件时,我都会将 GUID 转换为服务器端路径,访问文件并提供它,而不显示上传路径(实际上是超出了 IIS 内容域)。 - BigMike
如果用户是Windows身份验证,则真正的安全性也可以基于ACL。 - Jared Peless
1
请不要将代码混淆作为一种安全方法。 - jamesSampica

1

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

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

但是当某个用户登录应用程序时,他就被授权了。他能看到它的图片吗?然后他可以看到某些图像的路径,然后他可以猜测其他图像的路径吗?我是对的吗? - 1110
不,如果你将deny = * -放置在代码中,除了你的应用程序之外,没有人能看到这些图片。 - Sly
只有当runAllManagedModulesForAllRequests设置为true时才是真的。 直接文件请求不会通过asp.net管道。 - b_levitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接