當前位置:首頁 » 編程語言 » php圖片防盜鏈

php圖片防盜鏈

發布時間: 2022-08-27 06:41:14

A. 如何實現網站的防盜鏈

可以基於OSS的防盜鏈,目前OSS提供的防盜鏈的方法主要有兩種:


  • 設置Referer。控制台,SDK都可以操作,適合不想寫代碼的用戶,也適合喜歡開發的用戶;

  • 簽名URL,適合喜歡開發的用戶。 本文會給一個控制台設置Referer防盜鏈的具體事例,也會基於php SDK給一個動態生成簽名URL防盜鏈的示例。

  • 通過Referer防盜鏈的具體步驟

    第一步:進入 OSS 管理控制台界面。

    第二步:單擊目標存儲空間的名稱進入存儲空間管理頁面。

    第三步:單擊 Bucket 屬性 > 防盜鏈設置。


  • 第五步:單擊「提交」保存對防盜鏈的設置。

  • 舉例

    對於一個名為test-1-001的存儲空間,設置其referer 白名單為 http://www.aliyun.com。則只有 referer 為http://www.aliyun.com的請求才能訪問oss-example這個存儲空間中的對象。

    簽名URL實現步驟

    簽名URL的原理和實現方法見OSS開發人員指南授權第三方下載。 簽名URL的實現步驟:

    1、將Bucket的許可權設置為私有讀;

    2、 根據期望的超時時間(簽名URL失效的時間)生成簽名。

    具體實現

    第一步:安裝PHP最新代碼,參考PHP SDK文檔;

    第二步:實現生成簽名URL並將其放在網頁中,作為外鏈使用的簡單示例:


  • <?phprequire 'vendor/autoload.php';#最新PHP提供的自動載入use OSSOssClient;#表示命名空間的使用$accessKeyId="a5etodit71tlznjt3pdx7lch";#AccessKeyId,需要使用用戶自己的$accessKeySecret="secret_key";#AccessKeySecret,需要用用戶自己的$endpoint="oss-cn-hangzhou.aliyuncs.com";#Endpoint,根據Bucket創建的區域來選擇,本文中是杭州$bucket = 'referer-test';#Bucket,需要用用戶自己的$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$object = "aliyun-logo.png";#需要簽名的Object$timeout = 300;#期望鏈接失效的時間,這里表示從代碼運行到這一行開始的當前時間往後300秒$signedUrl = $ossClient->signUrl($bucket, $object, $timeout); #簽名URL實現的函數$img= $signedUrl;#將簽名URL動態放到圖片資源中並列印出來$my_html = "<html>";$my_html .= "<img src="".$img. "" />";$my_html .= "<p>".$img."</p>";$my_html .= "</html>";echo $my_html;?>

  • 第三步:通過瀏覽器訪問 多請求幾次會發現簽名的URL會變,這是正常的。主要是因為過期時間的改變導致的。這個過期時間是鏈接失效的時間,是以unix time的形式展示的。 如:Expires=189999,可以將這個時間轉換成本地時間。在Linux下的命令為date -d@189999,也可以在網路上找工具自行轉換。

    特別說明

    簽名URL可以和Referer白名單功能一起使用。

    如果簽名URL失效的時間限制在分鍾內,盜鏈用戶即使偽造了Referer也必須拿到簽名的URL,且必須在有效的時間內才能盜鏈成功。 相比只使用Referer來說,增加了盜鏈的難度。 也就是說簽名URL配合Referer白名單功能,可以增加防盜鏈的效果。

    防盜鏈總結,基於OSS的防盜鏈最佳實踐點如下

  • 使用三級域名URL,例如referer-test.oss-cn-hangzhou.aliyuncs.com/aliyun-logo.png,安全性比綁定二級域名更高。三級域名方式能夠提供Bucket級別的清洗和隔離,能夠應對被盜鏈後的流量暴漲的情況,也能避免不同Bucket間的互相影響,最終提高業務可用性;

  • 如果使用自定義域名作為連接,CNAME也請綁定到三級域名,規則是bucket + endpoint。假如你的bucket名為test,三級域名則為test.oss-cn-hangzhou.aliyuncs.com;

  • 對Bucket設定盡可能嚴格的許可權類別。例如提供公網服務的Bucket設置為public-read或private,禁止設置為public-read-write。Bucket許可權參見訪問控制;

  • 對訪問來源進行驗證,根據需要設置合適的Referer白名單;

  • 如果需要更嚴格的防盜鏈方案,請參考簽名的URL方案;

  • 記錄Bucket訪問日誌,能夠及時發現盜鏈活動和驗證防盜鏈方案的有效性。 訪問日誌參見設置訪問日誌記錄。

B. 如何解決圖片防盜鏈問題

新建一個文件名為img.php。引用方法如下:

http://dome.com/img.php?=微信圖片地址

代碼如下。

<?php
header("Content-Type:image/png");
$string=$_SERVER["QUERY_STRING"];
/*換一張空白圖片,如果遇到錯誤,需要用上*/
$im=imagecreate(600,300);
$black=imagecolorallocate($im,100,100,100);//圖片背景
$white=imagecolorallocate($im,255,255,255);
/*獲取圖片的真實地址*/
$url=strstr($string,"http");
if(!$url){
imagettftext($im,18,0,200,100,$white,"./fonts/hwxh.ttf","Error001");
imagettftext($im,14,0,150,150,$white,"./fonts/hwxh.ttf","請在參數中輸入圖片的絕對地址。");
imagepng($im);
exit();
}
@$imgString=urlOpen($url);
if($imgString==""){
imagettftext($im,18,0,200,100,$white,"./fonts/hwxh.ttf","Error002");
imagettftext($im,14,0,70,150,$white,"./fonts/hwxh.ttf","載入遠程圖片失敗,請確認圖片的地址能正常訪問。");
imagepng($im);
exit();
}
/*如果沒有錯誤*/
$im=imagecreatefromstring($imgString);
$white=imagecolorallocate($im,255,255,255);
/*加上水印*/
//imagettftext($im,12,0,20,20,$white,"./fonts/hwxh.ttf","水印的文字1");
//imagettftext($im,12,0,5,35,$white,"./fonts/hwxh.ttf","水印(可以寫你的網址)");
imagepng($im);

/*抓取圖片*/
functionurlOpen($url,$data=null,$ua='')
{
if($ua==''){
$ua='MQQBrowser/26Mozilla/5.0(Linux;U;Android2.3.7;zh-cn;MB200Build/GRJ22;CyanogenMod-7)AppleWebKit/533.1(KHTML,likeGecko)Version/4.0MobileSafari/533.1';
}else{
$ua=$ua;
}
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_USERAGENT,$ua);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
curl_close($ch);
return$content;
}

C. PHP文件防盜鏈了,怎麼破解呢

用CURL摸擬請求

$url="目標地址";

//.
functiondisguise_curl($url)
{
$curl=curl_init();

//Setupheaders-.0.0.6
//belowwassplitupbecausephp.netsaidthelinewastoolong.:/
$header[0]="Accept:text/xml,application/xml,application/xhtml+xml,";
$header[0].="text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[]="Cache-Control:max-age=0";
$header[]="Connection:keep-alive";
$header[]="Keep-Alive:300";
$header[]="Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[]="Accept-Language:en-us,en;q=0.5";
$header[]="Pragma:";//browserskeepthisblank.

curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_USERAGENT,'Googlebot/2.1');
curl_setopt($curl,CURLOPT_HTTPHEADER,$header);
curl_setopt($curl,CURLOPT_REFERER,'www.google.com');
curl_setopt($curl,CURLOPT_ENCODING,'gzip,deflate');
curl_setopt($curl,CURLOPT_AUTOREFERER,true);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_TIMEOUT,10);

$html=curl_exec($curl);//executethecurlcommand
curl_close($curl);//closetheconnection

return$html;//andfinally,return$html
}

//
$text=disguise_curl($url);
echo$text;

CURLOPT_REFERER這個的值設置成目標網站的域一般都能過。

D. 防盜鏈的代碼處理流程

此內容不在自己伺服器上,而通過技術手段,繞過別人放廣告有利益的最終頁,直接在自己的有廣告有利益的頁面上向最終用戶提供此內容。 常常是一些名不見經傳的小網站來盜取一些有實力的大網站的地址(比如一些音樂、圖片、軟體的下載地址)然後放置在自己的網站中,通過這種方法盜取大網站的空間和流量。

為什麼會產生盜鏈

一般瀏覽有一個重要的現象就是一個完整的頁面並不是一次全部傳送到客戶端的。如果請求的是一個帶有許多圖片和其它信息的頁面,那麼最先的一個Http請求被傳送回來的是這個頁面的文本,然後通過客戶端的瀏覽器對這段文本的解釋執行,發現其中還有圖片,那麼客戶端的瀏覽器會再發送一條Http請求,當這個請求被處理後那麼這個圖片文件會被傳送到客戶端,然後瀏覽器會將圖片安放到頁面的正確位置,就這樣一個完整的頁面也許要經過發送多條Http請求才能夠被完整的顯示。基於這樣的機制,就會產生一個問題,那就是盜鏈問題:就是一個網站中如果沒有起頁面中所說的信息,例如圖片信息,那麼它完全可以將這個圖片的連接到別的網站。這樣沒有任何資源的網站利用了別的網站的資源來展示給瀏覽者,提高了自己的訪問量,而大部分瀏覽者又不會很容易地發現,這樣顯然,對於那個被利用了資源的網站是不公平的。一些不良網站為了不增加成本而擴充自己站點內容,經常盜用其他網站的鏈接。一方面損害了原網站的合法利益,另一方面又加重了伺服器的負擔。

如何實現防盜鏈
要實現防盜鏈,我們就必須先理解盜鏈的實現原理,提到防盜鏈的實現原理就不得不從HTTP協議說起,在HTTP協議中,有一個表頭欄位叫referer,採用URL的格式來表示從哪兒鏈接到當前的網頁或文件。換句話說,通過referer,網站可以檢測目標網頁訪問的來源網頁,如果是資源文件,則可以跟蹤到顯示它的網頁地址。有了referer跟蹤來源就好辦了,這時就可以通過技術手段來進行處理,一旦檢測到來源不是本站即進行阻止或者返回指定的頁面。

如果想對自己的網站進行防盜鏈保護,則需要針對不同的情況進行區別對待。如果網站伺服器用的是apache,那麼使用apache自帶的Url Rewrite功能可以很輕松地防止各種盜鏈,其原理是檢查referer,如果referer的信息來自其他網站則重定向到指定圖片或網頁上。

如果伺服器使用的是IIS的話,則需要通過第三方插件來實現防盜鏈功能了,現在比較常用的一款產品叫做ISAPI_Rewrite,可以實現類似於apache的防盜鏈功能。另外對於論壇來說還可以使用「登錄驗證」的方法進行防盜鏈。

在IE或firefox瀏覽器中,我們可以使用HttpWatch抓包工具抓取網頁的表頭信息,該信息就包含了referer段內容,該內容反映的就是用戶是從哪個地址到達當前頁面的。下面使用PHP語句模擬「限制來路鏈接只能是本網站地址」的防盜鏈技術:

<?phpif(isset($_SERVER['HTTP_REFERER'])){//通過字元串處理函數匹配來路URL是否以本站域名打頭,是,則說明非盜鏈if(strpos($_SERVER['HTTP_REFERER']),'http://www.thanks.live')==0){echo "您是通過本站其他頁面鏈接到該頁面";}else{echo "本站禁止盜鏈";}}esle{echo "您是通過類似直接輸入當前URL的方式進入該頁面的";}?>由於referer值是極易偽造的,所以上述方法只是簡單的防盜鏈。

關於防禦方法,有以下3點:
1、不允許referer為空(不建議,因在某些開啟隱私模式的瀏覽器中,或https頁面引用下,referer是空的)
2、地址變更(lighttpd的是根據有效時間,nginx的根據是md5)
3、登錄校驗(如必須登錄網站帳號後才能訪問)

4.可以借鑒效仿crsf token令牌

二、應對方法
前端腳本
實現代碼:

function showImg( url ) {

var frameid = 'frameimg' + Math.random();

window.img = '<img id="img" src=\''+url+'?'+Math.random()+'\' /><script>window.onload = function() { parent.document.getElementById(\''+frameid+'\').height = document.getElementById(\'img\').height+\'px\'; }<'+'/script>';

document.write('<iframe id="'+frameid+'" src="javascript:parent.img;" frameBorder="0" scrolling="no" width="100%"></iframe>');

}

調用方式:

showImg('圖片地址');

關於防禦方法,有以下3點:

1、不允許referer為空(不建議,因在某些開啟隱私模式的瀏覽器中,或https頁面引用下,referer是空的)
2、地址變更(lighttpd的是根據有效時間,nginx的根據是md5)
3、登錄校驗(如必須登錄網站帳號後才能訪問)

後端代理:
那麼如何才能繞過防盜鏈對所需資源進行抓取???

php實戰

在通常的處理過程中,如果在自己的站點直接引入網路的圖片
這里寫圖片描述

(⊙o⊙)哦,引入鏈接失敗咯啊!!!那麼怎麼用curl處理
畢竟要爬取必要的信息

$url="https://gss0..com/9fo3dSag_xI4khGko9WTAnF6hhy/image/w%3D210/sign=/.jpg";
//$url = str_replace("http:/","http://",$url);
$dir = pathinfo($url);
$host = $dir['dirname'];
$refer = $host.'/';
$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 );

然後么,因為直接print了,所以結果是這樣的
這里寫圖片描述

python實戰

Flask響應請求有以下幾種方法:

render_template 返回模板文件
jsonify 返回json格式的數據
Response 自定義返回的數據及類型
當服務端需要返回圖片或者各種格式的文件時,就需要使用Response進行自定義返

E. 如何用PHP盜鏈一個圖片地址

<?php
header("Content-type: image/jpeg");
echo file_get_contents("http://aaa.com/".$_GET['url']);
?>
記住頭尾要干凈,要以「<?php」開頭不要有BOM,要以「?>」結尾不要有回車
那個類型的header只是提示瀏覽器,這是個圖。至於真正是JPG還是PNG,瀏覽器會自動識別的。
但是,別人可以防盜鏈的。當然,你也可以真正模仿瀏覽器訪問,那個就稍微復雜點,用CURL,學了沒太大用處的。

F. 怎樣防止自己網站上的圖片被別人盜用

圖片防盜: 是不想自己的圖片被別人使用。

圖片防盜鏈: 是不想自己的圖片被別人使用,且消耗的是自己的伺服器流量。

圖片防盜是困難的,完美的圖片防盜那幾乎是不可能的。但還是有很多方法能夠減少圖片盜用,下面是10種,選一種你喜歡的吧。

隱藏圖片

使用空白圖片覆蓋真實圖片

這個方法可以讓別人無法獲取真實的圖片,除非查看源代碼。

你可以把真實的圖片做為背景圖片,而使用一張透明圖片匹配尺寸並覆蓋到真實圖片上面。

例如:

<div id="image1" style="background-image: url(originalImage.jpg);">
<img src="blank.gif" height="250px" width="300px">
</div>

這樣,當別人使用右鍵查看或保存圖片的時候,得到的是這張透明圖片。

這里是2個 JavaScript框架可以實現這種圖片防盜鏈方法:

dwProtector for MooTools(dwProtector for jQuery)

自動截切圖片

Super Simple Image Tiles

這是一個非常有效的圖片防盜鏈方法。

它支持兩種方案:

讓用戶下載到的是被裁切過的圖片。

讓用戶下載到的是打上水印的圖片。

當用戶嘗試下載圖片的時候,它就會進行截切或添加水印操作,但是這個方法也有很大的劣勢:

造成太多的伺服器請求負荷,對網站整體性能影響不好

你將擁有許多的圖片文件

使用帶水印的圖片 (預先生成)

預先給圖片添加水印也是個防止圖片被盜的有效方法,就算別人要盜,至少也為你免費宣傳了一下自己的網站。

但缺點也來了:

圖片會看的不清楚或不美觀了(這對於圖片展示類的網站尤其重要,但又正是該類網站特尤其圖片防盜)

可以下載然後裁剪水印(當然,如果你是那種把水印放在圖片中間或水印有圖片這么1/3大的傢伙,就不用擔心這個問題了)

要手動添加水印的話,可以使用PhotoShop,GIMP,輕松水印等軟體。也可以選擇下面的一些在線圖片水印工具:

WatermarkTool

使用水印 (伺服器端生成)

使用伺服器端自動為圖片添加水印,是件省心的事情。只是需要一些腳本知識。

下面是一些相關的各種腳本語言的示例方案:

Asido: PHP Image Processing Library
Asido 是一個PHP圖像處理庫,可以運行於 GD2, Magick Wand 和 Image Magick.

這里 是 Asido 為圖片添加水印的詳細說明。

熱點內容
大型存儲櫃 發布:2025-01-17 06:08:27 瀏覽:644
發生腳本錯誤怎麼辦 發布:2025-01-17 06:03:02 瀏覽:793
刪除文件夾時顯示在另一程序打開 發布:2025-01-17 06:03:01 瀏覽:543
安卓手機怎麼裝驅動 發布:2025-01-17 06:02:17 瀏覽:622
安卓微信拍了拍怎麼改 發布:2025-01-17 05:57:31 瀏覽:46
BMF伺服器的系統服務怎麼關 發布:2025-01-17 05:50:29 瀏覽:876
免刷安卓系統怎麼進入usb調試 發布:2025-01-17 05:48:21 瀏覽:837
資料庫的三層架構 發布:2025-01-17 05:17:36 瀏覽:149
雲頂之弈有人開腳本怎麼舉報 發布:2025-01-17 05:16:59 瀏覽:682
sql包含數字 發布:2025-01-17 05:11:56 瀏覽:292