国产视频app今天因為需要寫一個調用百度搜索圖片的小插件,但是發現百度的圖片都有防盜鏈的,如果不是百度自家網站使用,是不顯示的。所以做了一個PHP的小文件,用來突破百度圖片的防盜鏈。

直接使用百度圖片鏈接

如下面的圖片鏈接

http://img0.imgtn.bdimg.com/it/u=2657861596,3149464998&fm=26&gp=0.jpg

国产视频app在瀏覽器里直接打開如下

利用PHP突破百度圖片防盜鏈

国产视频app但如果在HTML網頁中以IMG標簽的方法調用,如下

<img src="http://img0.imgtn.bdimg.com/it/u=2657861596,3149464998&fm=26&gp=0.jpg" />

直接顯示如下:

利用PHP突破百度圖片防盜鏈

如果在網頁中調用,會觸發圖片的防盜鏈接機制,圖片就不會正常顯示。

解決方法

在瀏覽器的控制臺中,可以查到百度圖片的請求頭,如下代碼

利用PHP突破百度圖片防盜鏈

国产视频appReferer是header的一部分,當瀏覽器向web服務器發送請求的時候,一般會帶上Referer,告訴服務器該請求是從哪個頁面鏈接過來的,如果來源的網址不屬于本站或在黑名單中,則服務器不響應瀏覽器的請求,達到了防盜鏈的目的。

我們可以利用PHP偽造一個請求的HEAD頭,來突破百度圖片的防盜鏈機制。

把以下代碼保存為 img.php 文件

<?php
$url = null;
if(count($_GET) > 1){
    foreach ($_GET as $key => $v) {
        if($key != 'url'){
            $url .= '&'.$key.'='.$v;
        }else{
            $url .= $v;
        }
    }
}else{
    $url = $_GET['url'];
}
//偽造 referer
$refer = 'http://image.baidu.com';  
$ch = curl_init($url);  
curl_setopt ($ch, CURLOPT_REFERER, $refer);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);  
$data = curl_exec($ch);  
curl_close($ch);  
header("Content-type: image/jpeg");  
print($data);  
?>

然后在HTML網頁如以下的方法調用圖片

<img src="img.php?url=http://img0.imgtn.bdimg.com/it/u=2657861596,3149464998&fm=26&gp=0.jpg" />

調用效果如下:.

利用PHP突破百度圖片防盜鏈

ps:此種方法也可以用在其它一些有防盜鏈機制的網站,可以達到同樣的效果。