模糊用于返回图像的HTTP处理程序

Rob*_*bie 1 c# asp.net iis-7 webforms

我正在尝试从HTTP处理程序中检索图像.

我遇到的一个问题是尝试使它只有应用程序可以访问图像,我已经尝试编辑匿名IIS身份验证以允许应用程序池标识,但这仍然允许用户通过.

这是一个例子:

  1. ASPX页面调用处理程序(picService.ashx?id = 1)通过查询字符串传入ID
  2. HTTP处理程序发送回图像
  3. 图像源是Services/picService.ashx?id = 1

一切正常.现在,如果用户想要访问picService.ashx并输入任何旧ID,它将返回与该ID相关的图像.我正在处理敏感信息,所以这是不可接受的.

我已经看过HTTP Forbidden处理程序但是我不确定我是否会走正确的路线.

我也尝试在ASPX页面中返回图像,但由于Image控件需要URL,因此无法执行此操作.

如何从数据库返回图像并使图像源安全?

我应该以不同的方式做这件事吗?或者我是在正确的轨道上(http禁止)?

Sti*_*ack 5

我过去使用的一种技术是让页面(步骤1)创建GUID,并注册由GUID键入的缓存项,该GUID在对象中具有实际的图像URL.该页面使用GUID构造处理程序的url并传递给处理程序

然后处理程序(步骤2)知道转到缓存以获取实际值并返回内容.

这样您只会暴露临时"魔术"值.它绝对是混淆,而不是替代适当的安全性.

作为一个例子(从内存中,语法可能稍微偏离)

在aspx或调用者中

    string keyValue = Guid.NewGuid().ToString();
    int yourImageID = 5;

    Cache.Add(keyValue, yourImageID) //expire in 5 or 10 seconds
    string url = "Handler.ashx?imgID=" + HttpUtility.UrlEncode(keyValue);
    Response.Redirect(url, false);
Run Code Online (Sandbox Code Playgroud)

在你的处理程序中(我主要使用ashx,选择适合你需要的任何东西)

 string key = HttpUtility.UrlDecode(context.Request.QueryString.Get("imgID"));

 int yourImageID = (int) context.Cache.Get(key);

 //get your image from the db and return the content
Run Code Online (Sandbox Code Playgroud)

再一次,仅仅因为我使用guid并不意味着你必须这样做,但是如果你试图模糊IDentity,那么选择一些与IDentity无关的东西.