监控图像访问和/或阻止直接访问

我希望用户将图像看作网页的一部分, 我想避免他们直接访问图像。 例如,这可以在URL中提供关于他们链接到哪个用户的线索(我在一个Facebook应用程序中看到的一个缺陷)。

如何监控图像访问和/或阻止直接访问图像(例如通过URL重写…)?

解答建议到目前为止:

  • 使用标题(可靠吗?)
  • 使图像访问更加困难(例如:将图像设置为div背景)。

没有防弹方式。 但是,您可以使用启发式方法。 检查以下标题:

  1. Referer – 此标头将出现是由于标签或CSS而浏览器请求的图像。 如果直接请求图像(通过在地址栏中键入URL),此标题将为空。 如果此标头包含另一个域,那么该其他网站热链接您的图像。 请注意,这是预期的行为,但不能保证每个浏览器都会以这种方式运行。

  2. Accept – 当请求image/*时,此标题将包含一个字符串,例如image/* ,因为浏览器发现它嵌入在HTML标记或CSS中。 当有人通过在浏览器中输入来直接请求图像时,您会发现诸如text/html,application/xhtml+xml等值。这是因为浏览器在请求http://website.com时不知道会发生什么。 /someimage.jpg ; 因此,它最好会要求提供text/html内容。

在Apache中,您可以检查(和匹配)HTTP标头以确定内容是否可访问。 我不确定其他平台,但您可以编写一个通用代理脚本来提供图像。

编辑

如果图像URL显示您不想公开的信息,则可以使用哈希或加密对其进行模糊处理。 因此,而不是提供如下内容:

  

你会写:

  

您需要编写一个脚本,将相应的图像发送到浏览器。

如果可以的话,那些又不是防弹的东西,但很多技巧就是将图像用作背景。 在HTML地方,一个图像标签填充了一个特殊的透明1px x 1xx gif(https://stackoverflow.com/questions/6882340/monitor-image-access-and-or-prevent-direct-access/blank.gif大约html表格布局),并将其大小调整为实际图像的尺寸。 然后将其背景图像设置为实际图像。 这将欺骗许多只知道如何右键单击下载/获取图像URL的用户。

         

我知道如果用户打印屏幕(但任何方法都没有),这将无济于事,但它是那些知识渊博的用户的解决方案。 另外,像Youtube这样的网站已经采用了这种方法,所以如果它对谷歌来说足够好,我会说它对你我来说已经足够了!

编辑:请原谅我完全缺乏意识,这已作为评论发布。 在发布之前我开始写作。

如上所述,这样做没有银弹(例如你不能阻止用户进行屏幕截图)

但是,如果您想保护您的图片免受匿名访问,您可以使用php“代理”来检查是否允许用户查看该图片,然后加载它。

这是一个非常简单的代理示例代码。 如果您真的想保护图像,请将它们存储在文档根目录之外。

  

如果要测试此脚本:

  • 把它放在你的docroot中
  • 在同一文件夹中添加png图像。 将此图片命名为img.png。
  • 要访问该图像,请使用http://url/of/the/script.php?allowed = 1
  • 访问计数器,删除’允许’var。

希望有所帮助!

这是一个可能有用的想法,虽然我并没有真正想到它,并且没有尝试过:

  1. 服务器收到页面请求。
  2. 使用引用图像的一次性密钥(OTK)在PHP中生成页面内容。 OTK可以存储在会话变量或数据库中。
  3. 当客户端呈现页面时,服务器使用OTK通过图像的查询参数接收请求。 提供图像并删除OTK。

例如,而不是:

…生成一次性密钥并将其存储在查找表中,以便它引用您的图像:

4e33fd162fe95 => image.jpg

…然后使用该OTK生成您的页面:

当服务器收到对该映像的请求时,发送映像,然后删除OTK。 这意味着每个页面请求都会生成一个新的OTK。 尝试再次使用该URI作为图像将无法正常工作。

这在性能方面有一些明显的警告,因为客户端缓存将不再起作用,并且它将在服务器上产生一些开销。 可能还有其他一些警告。