我目前正在开发MVC3上的图片存储,并且有一个如何限制图像访问的问题。
如果我将图像插入到HTML虱子<img src="/ImagesFolder/image0001.jpg">
中,它将被正确显示,但是在浏览器中编写完整路径的任何人都将获得该图像。我没有魔杖允许它。
一种方法是将图像嵌入为base64字符串,但它仅适用于小图像,我有大图像。
我见过建议创建图像访问操作,并使用类似的东西
<img src="/GetImage?ID=1123">
,但在那个GetImage页面,我仍然会使用直接路径或base64方法?并且在第一种方式中,imagefile的完整路径将被转换为父视图,并且仍然可以在图片属性中看到?
有没有办法在<img src="">
或其他任何方式使用System.Drawing.Image?你知道任何样品吗?
答案 0 :(得分:1)
执行此操作的一种方法是将所有图像放入http服务器未发布的路径中。这样,用户就无法直接在浏览器中添加路径。
脚本本身位于服务器上,因此可以访问此路径。您的图像访问方法应该是一个脚本,它返回实际数据并将其自身标识为它为jpegs提供image / jpeg的数据。这样,如果某人通过其他方式访问GetImage方法而不是您设计的方法,脚本可以检测它(通过引用或其他方式)并且不返回任何内容。
答案 1 :(得分:0)
我认为您提到的“图像访问操作”解决方案是最容易实现的解决方案。 GetImage脚本可以检查您在应用程序中设置的cookie,以便只有首次访问过您网站的人才能接收图像。
现在,如果你想阻止人们通过在访问你的网站之后在浏览器中输入网址来显示图片,这是更棘手的,我认为没有一个简单的解决方案为了那个原因。您可以检查Referer
HTTP标头以查看请求是否与您的网站相关(因为将URL放入URL栏时Referer将为空,但是当它包含图像时将包含该页面的URL包含在<img src=...>
),但这个解决方案有一个缺点,因为它会阻止浏览器不发送Referer标题(通常出于隐私原因;它不是一个非常广泛的配置,但这种情况发生)从看到您的图像所有。第二个可能的缺点是,人们可能会通过键入其URL来查看已在浏览器中缓存的图像,除非您可以将服务器配置为使用一些不允许缓存的标头来提供服务。