检查远程镜像是否被热链路保护

Check if a remote image is hotlink-protected

本文关键字:是否 链路 保护 镜像 程镜像 检查      更新时间:2023-09-26

我想检查远程映像是否受热链接保护。

  • 如果图像没有防止热链接,我想显示图像。(别担心,我会添加一个可见的超链接到源,我将给合法所有者删除图像的可能性。)
  • 如果图像是受保护的,我将不做任何事情。

是否有可能(与PHP和/或Javascript)使热链接保护图像和"热链接"图像之间的区别?

是的,你绝对可以从PHP中做到这一点。当你想要热链接文件时,创建一个HTTP连接,并在请求中设置Referer头到你的站点。如果您的图像数据得到200响应,则表示它不受热链接保护。如果您收到301转发响应,它是热链接保护。

这样做可能是最简单的:

<img src="http://example.com/image.png" onerror="alert('Image not found or protected');" />

当然,这是可以找到的,但这需要发出HTTP请求,这可能是昂贵的—特别是如果远程主机很慢或负载过重。

下面是如何在Ruby中实现的

class CheckImageHotlinkStatus
  require 'net/http'
  require 'uri'
  def self.call(image_url)
    uri = URI(image_url)
    req = Net::HTTP::Get.new(uri)
    req['Referer'] = 'http://your-site-here.com'
    response = Net::HTTP.start(uri.hostname, uri.port) do |http|
      http.request(req)
    end
    # Net::HTTPForbidden ...download & embed
    # Net::HTTPOK ...fine to hotlink
    # ...everything else 
    puts response.class
  end
end

使用客户端JavaScript无法轻松检测到此url,但可以使用hotlink.js完全绕过热链接保护。