網站資源防盜鏈結構設計
標題索引
追溯原因
數據測試
防盜結構
追溯原因
一步一印,有印為證,網站資源防盜鏈老生常談,但是如何才能確保網站資源如圖片等特殊資源不被盜鏈?這不僅僅是運維人員所考慮的問題,更是開發人員必須控制並解決的一個問題,但因爬蟲、瀏覽器插件和開發人員自行偽造http_referer等等技術原因,單純服務器端設置防盜鏈遠遠無法解決此問題,參考相關資料決定從架構的角度根本上解決防盜鏈(另外通過referer記錄請求資源從哪個網頁鏈接過來的,從而可統計百度推廣鏈接的次數等)。
數據測試
實驗目的:測試http攜帶referer時的條件
測試拓撲:見圖1-1
圖1-1 測試拓撲
測試配置:服務器配置Nginx服務,在Nginx服務中配置兩站點,並在站點www.a.com中映射資源a.jpg,站點www.b.com盜鏈www.a.com中的a.jpg資源,具體配置如下:
[ root@server conf.d ]#pwd /etc/nginx/conf.d [ root@server conf.d ]#vim virtual.conf server { listen 80; index index.html; server_name www.a.com; root /app/website01/; location /admin { return 403 } } server { listen 80; index index.html; server_name www.b.com; root /app/website02/; location /admin { return 403 } } [ root@server ~ ]#mkdir /app/website01 [ root@server ~ ]#echo "Welcome to website01" > /app/website01/index.html [ root@server ~ ]#cp /data/picture/a.jpg /app/website01/ [ root@server ~ ]#mkdir /app/website02 [ root@server ~ ]#echo "Welcome to website02" > /app/website02/index.html [ root@server ~ ]#echo "<img src=http://www.a.com/a.jpg" >> /app/website02/index.html
測試方法1:客戶端直接訪問www.b.com/a.jpg資源,測試結果為請求報頭中無referer信息,具體見圖1-2
圖1-2 客戶端直接請求資源抓包分析圖
測試方法2:客戶端訪問www.a.com資源,然後通過www.a.com中的鏈接文件進入www.b.com網站,測試結果為請求包頭中有referer信息,表明盜鏈地址來源,見圖1-3
圖1-3:客戶端盜鏈網站資源抓包分析圖
測試說明:以如下方式瀏覽在http請求報文頭部中無referer信息
1.用戶直接輸入網站,http請求報文中無referer信息;
2.通過瀏覽器插件,修改referer後,http請求報文無referer信息;
3.通過https跳轉至http中,http請求報文無referer信息。
防盜結構
根據上述測試可知,用戶在盜鏈時可以http頭部攜帶referer參數,因此在防盜鏈時總體設計思路如下:
1.服務器端開啟有效referer請求配置,非有效referer則返回錯誤403或錯誤404狀態碼;
2.服務器端設置有效referer後,防止客戶端偽造有效referer,如網站運行百度推廣或通過百度打開企業網站,因 此企業web搭建時將www.baidu.com列如有效referer,故客戶端偽造www.baidu.com的referer進行盜鏈。
3.防盜鏈技術層次采用,服務器A為圖片服務器,服務器B為對外服務器,服務器B調用圖片時,再次盜鏈圖片服務器A,因此當其他外網web服務器盜鏈本企業服務器Bweb的資源時,最多只能copy粘貼文字,而不能講企業內部服務器A資源圖片進行盜鏈。
總上上述防盜鏈設計思路,設計網站結構如下,也是當下互聯網企業常用技術方案之一,Web服務器資源動靜分離,圖片采用獨立的分布式存儲。拓撲圖如下:
圖1-4:Web防盜鏈結構設計
當然對外服務器端需配合http_referer_module更加安全可靠, 具體配置可參考如下:
[ root@server conf.d ]#vim virtual.conf server { listen 80; index index.html; server_name www.a.com; root /app/website01/; location / { valid_referers none blocked server_names #通配符,只要滿足如下通配符即可 *.a.com example.* www.a.com #正則表達式,定義模式\.baidu\.只要匹配此模式就允許通過 ~\.baidu\.; if ($invalid_referer) { return 403; } } location /admin { return 403 } }
本文出自 “一步一印,有印為證” 博客,謝絕轉載!
網站資源防盜鏈結構設計