我在一个为每个特定用户生成动态图像的网站上工作。有时这些图像包含非常敏感数据的描述。最近,我们开始以
的形式看到属于不同用户的图像请求http://myapp/images/someuid/image1.jpg
显然,有人发现如果他们创建了正确的URL,他们可以访问其他用户的图像。我们将图像存储到文件系统以帮助减少带宽。我们如何保护这个 - 某种http处理程序?
有没有办法为图像提供服务以利用o -f缓存而不必将其写入文件系统并让IIS执行脏工作?
答案 0 :(得分:5)
使用.ashx: -
TimeSpan maxAge = new TimeSpan(0, 15, 0); //!5 minute lifetiem.
context.Response.ContentType = "image/gif";
context.Response.Cache.SetCacheability(HttpCacheability.Private);
context.Response.Cache.SetExpires(DateTime.UtcNow.Add(maxAge));
context.Response.Cache.SetMaxAge(maxAge);
context.Response.Cache.SetLastModified(lastModified); // last modified date time of file
context.Response.WriteFile(filenameofGif);
您可以包含所需的代码检查,以确保正确的用户访问该图像。
答案 1 :(得分:1)
我认为最好的选择是拒绝从网络直接访问图像并创建一个aspx,它将检查用户权限并返回正确的图像。
答案 2 :(得分:1)
如果图像是特定用户专用的,那么您应该将它们存储在主应用程序文件夹之外,或者将web.config放在每个图像文件夹中(例如 someuid )和限制配置文件中的访问 - 切断所有人(deny =“*”)或仅允许特定用户访问(allow =“john”)。
在这两种情况下,您都可以使用处理程序将图像流式传输给用户,但至少您现在可以检查权限。如果请求用户没有权限,则向他抛出401,或者甚至显示另一个图像,如imagenotfound.gif。
但是,我担心处理程序会产生大量流量,因为每个图像会有一个调用,我不知道每个用户显示的图像数量。