圖片防盜鏈

臨時要求在apache中加防盜鏈。網上搜集了一些資料整理一下發在這裏,方便以後翻閱。 
關於mod_authz_host模塊參看:http://doc.linuxpk.com/doc/apache/mod/mod_authz_host.html 
1。通過User-Agent瀏覽器類型限制

SetEnvIf User-Agent ^blueapple go_out 
<directory /home/domain> 
Order Allow,Deny 
Allow  from all 
Deny from env=go_out 
</directory>

2。通過Referer限制

SetEnvIf Referfer ^$ go_out 
SetEnvIf Referfer ^http:\/\/baidu.com(\/|$)”  go_out 
<directory /home/domain> 
Order Allow,Deny 
Allow  from all 
Deny from env=go_out 
</directory>

referer爲空禁止訪問。 
referer爲http://baidu.com限制訪問。

防盜鏈原理:
http標準協議中有專門的字段記錄referer
一來可以追溯上一個入站地址是什麼

二來對於資源文件,可以跟蹤到包含顯示他的網頁地址是什麼。
因此所有防盜鏈方法都是基於這個Referer字段
主要有兩種方法實現
第一種:使用FilesMatch

    ServerAdmin laogui@gmail.com
    DocumentRoot D:/www/www.chinahtml.
com
    ServerName www.aaa.
com
    ServerName aaa.
com
    盜用連接指定顯示的頁面。也可以不用此項,這樣盜用連接也可無法使用。

    ErrorDocument 404 http://www.chinahtml.com/error.html
    允許www.aaa.com的網站使用
    SetEnvIfNoCase Referer "^http://www.aaa.com" local_ref=1
    允許 aaa.com  的網站使用
    SetEnvIfNoCase Referer "^http://aaa.com" local_ref=1
    定義防盜文件的擴展名      
        Order Allow,Deny

        Allow from env=local_ref  允許上面指定域

防盜鏈設置樣本:使用正則表達式

SetEnvIf Referer "^http://(.)+\.ilinux\.cn/" local_ref=1
    SetEnvIf Referer "^http://(.)+\.isql\.cn/" local_ref=1
    #SetEnvIf Referer "^http://(.)+\.other\.org\.cn/" local_ref=1
    SetEnvIf Request_URI "/logo(.)+" local_ref=0
        Order Allow,Deny
    Allow from env=local_ref

解釋:
1. 藍色部分,表示設置允許訪問的referer地址,第一行的意思爲所有http協議訪問,以.ilinux.cn結尾的域名地址,第二行類似,只是換成 了.isql.cn,表問我前面的鬼符是什麼,不懂得可以去翻正則表達式的研究文獻,不想深究的可以照貓畫虎設置自己的網站。
2. 綠色部分,表示不在上述引用域名範圍內,但可以被放行的特例,本例中表示網站/目錄,所有以logo開頭的文件(用作允許其它網站的友情連接引用本站logo)。
3. 橙色部分是設置反盜鏈的關鍵部分,上面每一個設置都聯繫到了local_ref這個環境變量,只有這個變量爲1,則允許被引用,否則顯示一個X。
4. 紫色部分設置了哪些擴展名的文件加入反盜鏈的規則。
第二種方法:
使用rewirte方式:

RewriteEngine on
    RewriteCond %{HTTP_REFERER} !^
$
    RewriteCond %{HTTP_REFERER} !^http://bbs.ilinux.cn/.*$    [NC]

    RewriteCond %{HTTP_REFERER} !^http://bbs.ilinux.cn$      [NC]
    RewriteCond %{HTTP_REFERER} !^http://www.ilinux.cn/.*$      [NC]
    RewriteCond %{HTTP_REFERER} !^http://www.ilinux.cn$      [NC]
    RewriteCond %{HTTP_REFERER} !^http://ilinux.cn/.*$      [NC]
    RewriteCond %{HTTP_REFERER} !^http://ilinux.cn$      [NC]
    RewriteRule .*\.(gif|jpg|jpeg|avi|bmp|ram|rmvb|rm|rar|zip)$ http://www.ilinux.cn [R,NC]

上面的,需要Rewrite模板.所有指定的文件,如果Referer不是上面的值,將被重定向到首頁.
還有使用.htaccess 文件的方法,不過不推薦使用,影響apache性能。
寫一個.htaccess
包括以下代碼:

SetEnvIfNoCase Referer "^http://google\.com/" local_ref=1
Order Allow,DenyAllow from env=local_ref
Allow from 127.0.0.1Allow from 123.123.123.12

如果你的網址是www.myst.cn就改爲
SetEnvIfNoCase Referer “^http://www\.myst\.com/” local_ref=1

這意思是說防止人家連結你的jpg檔案.可以增修爲

ps.最後一個不使用區各線
Allow from 127.0.0.1
這表示允許連結主機的IP。
你要是默認其他網站可以連結的話,就填入該主機IP,把上述的code儲存爲.htaccess然後放入你安裝的目錄下即可。
@@@@@@@@@@@@@@@@@

防盜鏈原理:
http標準協議中有專門的字段記錄referer
一來可以追溯上一個入站地址是什麼;
二來對於資源文件,可以跟蹤到包含顯示他的網頁地址是什麼。
因此所有防盜鏈方法都是基於這個Referer字段,主要有兩種方法實現:

第一種:使用FilesMatch
ServerAdmin 
[email protected]
DocumentRoot
 D:/www/www.chinahtml.com
ServerName 
www.aaa.com
ServerName aaa.com


盜用連接指定顯示的頁面。也可以不用此項,這樣盜用連接也可無法使用。
ErrorDocument 404

http://www.chinahtml.com/error.html


允許www.aaa.com的網站使用
SetEnvIfNoCase Referer “^http://www.aaa.com” local_ref=1


允許 aaa.com   的網站使用
SetEnvIfNoCase Referer “^http://aaa.com” local_ref=1


定義防盜文件的擴展名
Order Allow,Deny
Allow from env=local_ref   允許上面指定域名

 

 

 

防盜鏈設置樣本:使用正則表達式
SetEnvIf Referer “^http://(.)+\.ilinux\.cn/” local_ref=1
SetEnvIf Referer “^http://(.)+\.isql\.cn/” local_ref=1
#SetEnvIf Referer “^http://(.)+\.other\.org\.cn/” local_ref=1
SetEnvIf Request_URI “/logo(.)+” local_ref=0
Order Allow,Deny
Allow from env=local_ref

解釋:
1. 藍色部分,表示設置允許訪問的referer地址,第一行的意思爲所有http協議訪問,以.ilinux.cn結尾的域名地址,第二行類似,只是換成 了.isql.cn,表問我前面的鬼符是什麼,不懂得可以去翻正則表達式的研究文獻,不想深究的可以照貓畫虎設置自己的網站。
2. 綠色部分,表示不在上述引用域名範圍內,但可以被放行的特例,本例中表示網站/目錄,所有以logo開頭的文件(用作允許其它網站的友情連接引用本站logo)。
3. 橙色部分是設置反盜鏈的關鍵部分,上面每一個設置都聯繫到了local_ref這個環境變量,只有這個變量爲1,則允許被引用,否則顯示一個X。
4. 紫色部分設置了哪些擴展名的文件加入反盜鏈的規則。

第二種方法:
使用rewirte方式:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://bbs.ilinux.cn/.*$     [NC]
RewriteCond %{HTTP_REFERER} !^http://bbs.ilinux.cn$       [NC]
RewriteCond %{HTTP_REFERER} !^http://www.ilinux.cn/.*$       [NC]
RewriteCond %{HTTP_REFERER} !^http://www.ilinux.cn$       [NC]
RewriteCond %{HTTP_REFERER} !^http://ilinux.cn/.*$       [NC]
RewriteCond %{HTTP_REFERER} !^http://ilinux.cn$       [NC]
RewriteRule .*\.(gif|jpg|jpeg|avi|bmp|ram|rmvb|rm|rar|zip)$ 
http://www.ilinux.cn [R,NC]
上面的,需要Rewrite模板。所有指定的文件,如果Referer不是上面的值,將被重定向到首頁。

還有使用.htaccess 文件的方法,不過不推薦使用,影響apache性能。
寫一個.htaccess
包含以下代碼:
SetEnvIfNoCase Referer “^http://google\.com/” local_ref=1
Order Allow,Deny
Allow from env=local_ref
Allow from 127.0.0.1
Allow from 123.123.123.123

如果你的網址是www.myst.cn就改爲
SetEnvIfNoCase Referer “^http://www\.myst\.com/” local_ref=1
這意思是說防止人家連結你的jpg檔案。可以增修爲
<FilesMatch “\.(jpg|zip|rar)”>
ps:最後一個不使用區各線
Allow from 127.0.0.1 這表示允許連結主機的IP。
你要是默認其他網站可以連結的話,就填入該主機IP,把上述的code儲存爲.htaccess然後放入你安裝的目錄下即可。

注:*nix系統在apache配置文件裏面打開使用.htaccess功能。

下面一一介紹怎麼在Apache裏面實現防盜鏈、限制客戶端下載線程數,限制下載帶寬這些功能。
防盜鏈
傳統的防盜鏈都是通過Referer來判斷用戶來路的,不過這樣的方法對於下載工具來說形同虛設,因爲現在的下載工具早就能僞造Referer了。
現在一些流行的防盜鏈的方式都是用在瀏覽頁面的時候產生一個隨機驗證碼,在用戶點擊連接的時候服務器會驗證這個驗證碼是否有效從而決定是否允許下載。或者就是用某些方法把文件實際地址進行僞裝。不過這些都不怎麼好用,下面介紹一個簡單有效的方式來實現防盜鏈。
其實就是用Cookie,配合Apache的URL Rewrite模塊很簡單的就能實現防盜鏈下載。
首先在瀏覽頁面的時候,會向客戶端發送一個特別的Cookie,例如“Site=jzxue.Com“,盜鏈而來的將沒有這個Cookie。
在Apache的httpd.conf文件裏面搜索:
#LoadModule rewrite_module modules/mod_rewrite.so
把它前面的#去掉,
再找到塊,在裏面加入類似如下代碼:
# Other configurati**** …
RewriteEngine On # 啓動URL Rewrite引擎
RewriteCond %{HTTP_COOKIE} !^.*(?:Site=jzxue.Com).*$ # 對於Cookie裏面沒有特殊記錄的請求進行重定向
RewriteRule ^.*$ error.html # 將非法訪問重定向到錯誤頁面
這樣如果一個盜鏈而來的請求將會因爲沒有特殊Cookie而被重定向到錯誤頁面,就算實際地址暴露也不怕。至於這個Cookie的內容是什麼以及有效時間完全可以由管理員自己來設定,也就是說下載工具也沒法僞造,從而防止了服務器資源被盜鏈的危險。

限制客戶端多線程下載
限制多線程現在需要用到一個Apache的擴展模塊mod_limitipconn,這裏是作者的官方網站
http://dominia.org/djao/limitipconn2.html,先下載適合自己版本的模塊文件到Apache安裝目錄下的modules目錄下面,然後在httpd.conf文件中搜索:
#LoadModule status_module modules/mod_status.so
把它前面的#去掉,再加入:
ExtendedStatus OnLoadModule limitipconn_module modules/mod_limitipconn.dll # 如果你下載的不是Win版,請把後面的文件名改爲你所下載的文件名。
# 這裏表示限制根目錄,即全部限制,可以根據需要修改
MaxConnPerIP 2 # 這裏表示最多同時兩個線程
NoLimit html/* # 這裏表示html目錄下不受限制
這樣來自同一客戶端的超過2個的線程請求將被拒絕,從而限制了客戶端的多線程下載。

限制下載帶寬
這個同樣需要擴展模塊支持,模塊是mod_bw,在作者的官方網站
http://ivn.cl/apache/可以下載到。同樣也是放入modules目錄下面,然後在httpd.conf文件中加入:
LoadModule bw_module modules/mod_bw.dll
再找到塊,加入:
# Other configurati**** …
BandwidthModule On # 啓動帶寬限制
ForceBandwidthModule On # 啓動帶寬限制
MaxConnection all 2000 # 最大連接數2000
Bandwidth all 200000 # 單個客戶端最大帶寬200KB
這樣限制了同時最多2000個連接數,每個客戶端最大200KB的下載帶寬。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章