1

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

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

这是一个例子:

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

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

我看过 HTTP Forbidden 处理程序,但我不确定我是否走在正确的道路上。

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

如何从数据库返回图像并确保图像来源安全?

我应该以不同的方式这样做吗?还是我在正确的轨道上(http 被禁止)?

4

4 回答 4

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);

在您的处理程序中(我主要使用 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

同样,仅仅因为我使用了 guid 并不意味着您必须这样做,但是如果您试图混淆 IDentity,请选择与 IDentity 不相关的内容。

于 2013-05-21T16:12:04.117 回答
2

您提出问题的方式无法保证 100% 的安全。那么,您愿意允许哪些取舍,而您不允许哪些取舍呢?

你到底想防止什么?只有一个用户没有看到另一个用户的图像?还是同时预防right-click, save image as

想到的一个想法是将用户的 ip 地址与图像的 id 结合起来,对其进行哈希处理,然后将其放入缓存中(或使用 guid 作为键来查找这些值)。一旦使用了该哈希值,可能会将其从缓存中删除,因此只允许图像在它应该位于的每个页面上通过一个ip加载一次。

您应该能够将生成的ID和真实之间的映射扔到会话中,或者HttpRuntime.Cache.Insert(cacheName, cachedValue) 数据库可能不是最好的答案,它们是少量数据,您可以将过期时间设置为一个较小的值,所以除非您有数百万用户同时...

就无法右键单击将图像另存为而言,使用 Flash 控件加载图像是安全的。如果您担心有人截取图像流,也可能会加密流,或拆分图像标头或其他东西。他们仍然可以获得图像的 url,但是您的 flash 控件可以使用普通用户很难理解的特殊标题。

于 2013-05-21T17:19:46.880 回答
0

将 URL 和参数存储在 Session 状态中,并在 HttpHandler 中访问 Session。为此,您需要在处理程序中实现 IRequiresSessionState:

HttpHandler 和会话状态的问题

在 HttpHandlers 中获取会话状态(ASHX 文件)

于 2013-05-21T16:17:29.060 回答
0

First and foremost you have to know what do you consider as OK to show photo . What is your authentication parameter. Like if user is allow to see the pic when is authenticated , check the same in , ashx page before allowing it to see. Because calling inside the html as src or putting the same in browser does not make any difference for server . So you need to check some validation in case user is not at all supposed to see in any way directly or in directly

于 2013-05-21T16:14:58.517 回答