ASP.NET 核心保护映像



我有一个非常简单的 asp.net 核心 2.0 应用程序,它看起来像一个非常简单的问题,但我找不到解决方案。

我的应用程序为用户存储不同的私人图像,如照片,他们的身份证复印件......当然,这些图像必须是私有的,只有Web应用程序才能在某些页面中显示它们。例如,管理员可以在管理面板中浏览用户时看到它们,或者用户可以看到他的图像......

这些文件位于文件夹"users/1/photo.jpg"或"users/243/id.jpg"中。当然,这些文件夹必须是私有的,您无法浏览它们。

当我使用图像标签时,我该怎么做,我可以看到图像:

<img src="???">

没有显示真实路径,也没有阻止任何人访问该文件,但我想要的页面除外。

谢谢。

更新
首先,感谢马克·雷德曼和TS,你帮助了很多。

最后,我要做的是将合理的图像放在 StaticFiles 公用文件夹之外,将不合理的图像放在 wwwroot 文件夹中。

第 1 部分。对于
敏感图像,我使用 IActionResult 返回文件,但在加密文件名之后。这只是一个例子...

public IActionResult ViewUser(int id)
{
var model = new Model();
....
model.EncryptedId = _protector.Protect(id.ToString("D6"));
return View(model);
}

这样,我可以返回加密的 id 以检索我想要的图像,而无需发布真实 id。

在我看来:

<img src="/home/GetImage?id=@Model.EncryptedId" />

GetImage 看起来像这样:

public IActionResult GetImage(string encryptedId)
{
var decryptedId = _protector.Unprotect(encryptedId);
var file = Path.Combine(_hostingEnvironment.ContentRootPath, "MyPrivateFiles", decryptedId + ".jpg");
return PhysicalFile(file, "image/jpeg");
} 

这样,据我了解:
- 我通过不存储在 wwwroot 等公共文件夹中来保护我的私人文件,因此没有人可以直接下载它们。
- 也没有人可以获取现有用户的 ID 并尝试调用我的 Action GetImage?id=232,因为我已加密了该 ID。

我可以拥有的其他保护级别是仅授权某些用户访问 GetImage 操作,例如仅允许用户获取其图像或允许管理员下载任何图像。

第 2 部分。对于不合理的图像
(例如用户公共照片(,我将它们存储在 wwwroot 中,因为我需要它们是公开的。

使用 asp-append-version="true" 我可以缓存图像,这是对这个 Asp.Net 核心的一个非常好的改进。

留给我的唯一事情就是混淆这些图像名称,这样我就不会显示"domain.com/users/1234.jpg"并显示例如"domain.com/users/sdfjknkjSD2.jpg"。

我不知道如何在不失去缓存优势的情况下做到这一点。 有没有办法做到这一点?

提前谢谢。

最佳做法是不要将图像存储在 Web 文件夹中。

这是一个非常基本的动作,像这样...

[HttpGet]
public FileResult GetImage(string userId, string id)
{
return File($"{YourRootPath}users/{userId}/{id}.jpg"), "image/jpeg");
}
<img src="/YourController/GetImage/?userId=243&id=123"/>

对于 .NET 核心,您可能希望执行此操作;

public async Task<IActionResult> GetImage(string userId, string id)
{
Stream stream = await [get stream here__]
if(stream == null)
return NotFound();
return File(fileStream, "image/jpeg", $"{id}.jpg");
}   

我可以建议解决此问题的一种解决方案是,使用 GUID ID 创建一个文件夹并将用户的图像存储在该文件夹中。因此,每个用户都会发生这种情况,因此现在在使用img标签显示时,只有应用程序才能呈现正确的图像,因为路径是从数据库派生的,而黑客会发现几乎不可能猜出guid id,它本质上是一个文件夹名称,并且需要猜测图像并将其呈现在网页上。

最新更新