php破解圖片防盜鏈
⑴ 網站下載時,什麼叫「盜鏈」
盜鏈是指服務提供商自己不提供服務的內容,通過技術手段繞過其它有利益的最終用戶界面(如廣告),直接在自己的網站上向最終用戶提供其它服務提供商的服務內容,騙取最終用戶的瀏覽和點擊率。受益者不提供資源或提供很少的資源,而真正的服務提供商卻得不到任何的收益。
編輯本段盜鏈分類
網站盜鏈會大量消耗被盜鏈網站的帶寬,而真正的點擊率也許會很小,嚴重損害了被盜鏈網站的利益。早期的盜鏈一般是一些比較小的網站盜取一些有實力的大網站的地址,盜鏈的目標比較有針對性,現如今,一些大型的網站也已經開始把盜鏈的目光鎖定在了整個互聯網上,竊取整個互聯網上的其它機器的帶寬。常見的盜鏈有以下幾種:圖片盜鏈、音頻盜鏈、視頻盜鏈、文件盜鏈。
一般要被瀏覽的頁面並不是一次全部傳送到客戶端的。如果客戶請求的是一個帶有許多圖片和其它信息的頁面,那麼最先的一個HTTP 請求被傳送回來的是這個頁面的HTML文本,客戶端瀏覽器對這段文本解釋執行後,發現其中還有其它文件,客戶端瀏覽器會再發送一條或者更多HTTP請求,當這些請求被處理後其它文件才被傳送到客戶端,然後瀏覽器將這些文件放到頁面的正確位置。一個完整的頁面要經過發送多條HTTP
請求才能夠被完整地顯示。基於這樣的機制,盜鏈就成為可能,服務提供商完全可以在自己的頁面中嵌入別人的鏈接,顯示在自己的頁面上,以達到盜鏈的目的。
根據盜鏈的形式的不同,可以簡單地把盜鏈分成兩類:常規盜鏈和分布式盜鏈。常規盜鏈比較初級,同時也比較常見,具有一定的針對性,只盜用某個或某些網站的鏈接。技術含量不高,實現也比較簡單,只需要在自己的頁面嵌入別人的鏈接即可。分布式盜鏈是盜鏈的一種新的形式,系統設計復雜,難度相對較大。這種盜鏈一般不針對某一個網站,互聯網上任何一台機器都可能成為盜鏈的對象。服務提供商一般會在後台設置專門程序(Spider)在Internet上抓取有用的鏈接, 然後存儲到自己的資料庫中。而對於最終用戶的每次訪問,都將其轉化為對已有資料庫的查詢,被查詢到的URL 就是被盜鏈的對象。由於對文件的訪問已經被瀏覽器屏蔽掉了,所以最終用戶感覺不到所訪問的鏈接是被盜取的鏈接。
編輯本段反盜鏈
原始方式
不定期的更改文件或者目錄的名稱,是最原始的反盜鏈的方式,可以比較有效地防止盜連,這種方法一般工作量比較大。但是批量的文件改名是完全可以自動化的,而且也比較容易實現。在文件的更名過程中,
可能會有客戶正在下載該文件,這樣會導致正常的客戶訪問失敗,盡管這個問題容易解決,但是也不能夠忽視。
限制引用頁
這種防盜鏈原理是,伺服器獲取用戶提交信息的網站地址,然後和真正的服務端的地址相比較,如果一致則表明是站內提交,或者為自己信任的站點提交,否則視為盜鏈。實現時可以使用HTTP_REFERER1
和htaccess 文件(需要啟用mod_Rewrite),結合正則表達式去匹配用戶的每一個訪問請求。對於每一個HTTP 請求, 伺服器都要查找.htaccess
文件,增加了讀取文件的次數,一定程度上降低了性能。另外,伺服器打開這個功能,有比較多的限制。
文件偽裝
文件偽裝是目前用得最多的一種反盜鏈技術,一般會結合伺服器端動態腳本(php/JSP/ASP)。實際上用戶請求的文件地址,只是一個經過偽裝的腳本文件,這個腳本文件會對用戶的請求作認證,一般會檢查Session,Cookie 或HTTP_REFERER
作為判斷是否為盜鏈的依據。而真實的文件實際隱藏在用戶不能夠訪問的地方,只有用戶通過驗證以後才會返回給用戶。
加密認證
這種反盜鏈方式,先從客戶端獲取用戶信息,然後根據這個信息和用戶請求的文件名字一起加密成字元串(Session
ID)作為身份驗證。只有當認證成功以後,服務端才會把用戶需要的文件傳送給客戶。一般我們會把加密的Session ID 作為URL
參數的一部分傳遞給伺服器,由於這個Session ID 和用戶的信息掛鉤,所以別人就算是盜取了鏈接,該Session ID 也無法通過身份認證,從而達到反盜鏈的目的。這種方式對於分布式盜鏈非常有效。
隨機附加碼
每次,在頁面里生成一個附加碼,並存在資料庫里,和對應的圖片相關,訪問圖片時和此附加碼對比,相同則輸出圖片,否則輸出404圖片
其它方法
其它反盜鏈方式也有不少, 這里只列出一個大概思想作為參考:⑴ IIS 反盜鏈,
利用ISAPI_Rewrite,可作為Windows下反盜鏈的一個解決方案;⑵ 圖片反盜鏈,在圖片中加入水印,雖然盜鏈者可以達到目的,但是卻也在為自己的網站做宣傳。
編輯本段防盜鏈
KS-WAF通過實現URL級別的訪問控制,對客戶端請求進行檢測,如果發現圖片、文件等資源信息的HTTP請求來自於其它網站,則阻止盜鏈請求,節省因盜用資源鏈接而消耗的帶寬和性能。
⑵ 如何實現網站的防盜鏈
可以基於OSS的防盜鏈,目前OSS提供的防盜鏈的方法主要有兩種:
設置Referer。控制台,SDK都可以操作,適合不想寫代碼的用戶,也適合喜歡開發的用戶;
簽名URL,適合喜歡開發的用戶。 本文會給一個控制台設置Referer防盜鏈的具體事例,也會基於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,例如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訪問日誌,能夠及時發現盜鏈活動和驗證防盜鏈方案的有效性。 訪問日誌參見設置訪問日誌記錄。
通過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並將其放在網頁中,作為外鏈使用的簡單示例:
第三步:通過瀏覽器訪問 多請求幾次會發現簽名的URL會變,這是正常的。主要是因為過期時間的改變導致的。這個過期時間是鏈接失效的時間,是以unix time的形式展示的。 如:Expires=189999,可以將這個時間轉換成本地時間。在Linux下的命令為date -d@189999,也可以在網路上找工具自行轉換。
特別說明
簽名URL可以和Referer白名單功能一起使用。
如果簽名URL失效的時間限制在分鍾內,盜鏈用戶即使偽造了Referer也必須拿到簽名的URL,且必須在有效的時間內才能盜鏈成功。 相比只使用Referer來說,增加了盜鏈的難度。 也就是說簽名URL配合Referer白名單功能,可以增加防盜鏈的效果。
防盜鏈總結,基於OSS的防盜鏈最佳實踐點如下:
⑶ 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這個的值設置成目標網站的域一般都能過。