热链接保护检查标题200即将到来,但页面受到保护

时间:2013-12-18 14:16:42

标签: php http-headers hotlinking

您好我想检查图片是否受到热链接保护。我搜索了几个网站,发现http标头是检查这个的最佳解决方案但是当我实现时我发现它给出了错误的结果。

例如http标头响应即将到来

  Array ( [0] => HTTP/1.1 200 OK [1]

但是当我在iframe中链接或直接在php中它抛出error.access否认图像被hotlinked保护。我正在尝试这个图片链接

  <?php
     $url = 'http://s.wallpaperhere.com/thumbnails/preview/20130702/51d3b5478d616.jpg';
     print_r(get_headers($url));
     print_r(get_headers($url, 1));
  ?>

有没有最好的方法来解决这个问题,并将正确的图像存储在未受保护的数据库中

1 个答案:

答案 0 :(得分:0)

“hotlink”检测通常在引用者标题上执行。您的示例不会发送引荐来源,因此远程端假设它是直接请求。

您可以使用stream_context_set_default()将引用标头添加到get_headers()调用中。以下示例。甚至不需要改变我提供的标题值......我认为它可以是任何东西。

<?php
$default_opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Referer: http://www.fakesite.com/hotlink-check/",
  )
);

stream_context_set_default($default_opts);

$url = 'http://s.wallpaperhere.com/thumbnails/preview/20130702/51d3b5478d616.jpg';
print_r($headers = get_headers($url, 1));

if (preg_match('/200 OK$/', $headers[0])) {
        echo 'OK';
}
else {
        echo 'Not OK';
}

我已经使用您的示例网址对其进行了测试,并且按预期工作。输出如下:

Array
(
    [0] => HTTP/1.1 403 Forbidden
    [Server] => cloudflare-nginx
    [Date] => Wed, 18 Dec 2013 16:57:54 GMT
    [Content-Type] => text/html; charset=UTF-8
    [Connection] => close
    [Set-Cookie] => __cfduid=de5cd2750b3e7c528e277df1e584c3a6c1387385874336; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.wallpaperhere.com; HttpOnly
    [Cache-Control] => max-age=10
    [Expires] => Wed, 18 Dec 2013 16:58:04 GMT
    [CF-RAY] => ded65129fde0610
)
Not OK