0

我目前正在 MVC3 上开发图片存储,并且有一个问题如何限制对图像的访问。如果我将图像插入 HTML lice <img src="/ImagesFolder/image0001.jpg">,它将正确显示,但任何在浏览器中编写完整路径的人也会得到该图像。我不想允许。一种方法是将图像嵌入为 base64 字符串,但它仅适用于小图像,我有大图像。

我已经看到了创建图像访问操作的建议,并使用类似的东西 <img src="/GetImage?ID=1123">,但是在那个 GetImage 页面上,我仍然会使用直接路径或 base64 方法吗?并且在第一种方式中,图像文件的完整路径将被转换为父视图,并且仍然可以在图片属性中看到?

有没有办法以<img src=""> 或任何其他方式使用 System.Drawing.Image?你知道任何样品吗?

4

2 回答 2

1

一种方法是将所有图像放入 http 服务器未发布的路径中。这样就没有用户可以放入浏览器的直接路径。

脚本本身位于服务器上,因此它们可以访问此路径。您的图像访问方法应该是一个脚本,它返回实际数据并将自身标识为它为 jpegs 提供图像/jpeg 的数据。这样,如果有人通过您设计的方式以外的其他方式访问 GetImage 方法,则脚本可以检测到它(通过引用或其他方式)并且不返回任何内容。

于 2013-03-28T08:10:49.830 回答
0

我认为您提到的“图像访问操作”解决方案是最容易实现的解决方案。例如,GetImage 脚本可以检查您在应用程序中设置的 cookie,以便只有第一次访问您的站点的人才能收到图像。

现在,如果您想阻止人们在访问您的网站通过在浏览器中键入 URL 来显示图像,这将更加棘手,并且在我看来,没有一个简单的解决方案。您可以检查RefererHTTP 标头以查看请求是否与您的网站相关(因为在将 URL 放入 URL 栏中时,Referer 将为空,但当包含图像时,将包含包含图像的页面的 URL<img src=...>),但是这个解决方案有一个缺点,因为它会阻止浏览器不发送 Referer 标头(通常是出于隐私原因;它不是一个非常广泛的配置,但会发生这种情况)根本看不到您的图像。第二个可能的缺点是人们可能会通过键入他们的 URL 来查看已经缓存在浏览器中的图像,除非您可以将服务器配置为使用一些不允许缓存的标头来为它们提供服务。

于 2013-03-28T08:07:43.513 回答