我正在尝试从 HTTP 处理程序中检索图像。
我遇到的一个问题是试图让它只有应用程序可以访问图像,我已经尝试编辑匿名 IIS 身份验证以允许应用程序池身份,但这仍然允许用户通过。
这是一个例子:
- ASPX 页面调用处理程序 (picService.ashx?id=1) 通过查询字符串传入 ID
- HTTP 处理程序发回图像
- 图片来源是Services/picService.ashx?id=1
一切正常。现在,如果用户想要访问 picService.ashx 并输入任何旧 ID,它将返回与该 ID 相关的图像。我正在处理敏感信息,所以这是 Not Acceptable 。
我看过 HTTP Forbidden 处理程序,但我不确定我走的路是否正确。
我也试过在 ASPX 页面中返回图像,但由于图像控件需要 URL,所以你不能这样做。
如何从数据库返回图像并确保图像来源安全?
我应该换一种方式吗?还是我在正确的轨道上(http 被禁止)?
最佳答案
我过去使用的一种技术是让页面(第 1 步)创建一个 GUID,并注册一个由 GUID 键控的缓存项,该 GUID 在对象中具有实际图像 URL。该页面使用 GUID 为处理程序构造 url 并传递给处理程序
处理程序(第 2 步)然后知道去缓存获取实际值并返回内容。
这样你只公开了临时的“魔法”值。它绝对是混淆,不能替代适当的安全性。
举个例子(凭内存,语法可能有点偏差)
在aspx或caller中
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 不相关的东西。
关于c# - 混淆旨在返回图像的 HTTP 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16674588/