需要解決的問題
簡(jiǎn)單的說(shuō),這里有兩種不同的盜用行為:
1. 使用HTML標(biāo)記IMG在自己的網(wǎng)站中引用網(wǎng)站的圖片。
2. 從網(wǎng)站上下載圖片,然后放在自己的網(wǎng)站上。
對(duì)于第一種的盜用行為,合法網(wǎng)站的圖片被用來(lái)美化裝飾其它網(wǎng)站,這種盜用對(duì)合法網(wǎng)站的損害比較大,因?yàn)樵L問非法網(wǎng)站的訪問者其實(shí)是從合法網(wǎng)站獲取圖片的,合法網(wǎng)站的日志文件充滿了訪問請(qǐng)求記錄,并且?guī)挶环欠ㄔL問消耗,而合法網(wǎng)站卻沒有得到任何好處。這種類型的盜用通過技術(shù)手段完全可以被防止。
第二種類型的盜用相對(duì)來(lái)說(shuō)比較陰險(xiǎn),瀏覽者在非法網(wǎng)站直接訪問非法的圖片,而合法網(wǎng)站的版權(quán)受到侵害,卻得不到賠償,甚至無(wú)法發(fā)現(xiàn)這種盜用。因?yàn)閃eb的工作方式對(duì)這種類型的盜用實(shí)際上無(wú)法被阻止,但是可以使得這種盜用更加困難。
完全杜絕這兩種盜用行為是不現(xiàn)實(shí)的,但是通過技術(shù)手段可以使得這種盜用非常困難。在Apache環(huán)境下,通過配置可以限制網(wǎng)站圖片被盜用。
解決方法
如下配置可以存放在服務(wù)器配置文件httpd.conf中,或者存放在.htaccess文件中(開啟AllowOverride All),最后的效果是一樣的:在這些命令作用的范圍內(nèi),只有從本網(wǎng)站引用的圖片才可以被訪問。
SetEnvIfNoCase Referer "^http://my.apache.org/" local_ref=1
SetEnvIf Request_URI "(.)*logo" local_ref=0
<FilesMatch ".(gif|jpg|png|jpeg)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
解釋:
標(biāo)識(shí)需要保護(hù)的文件
<FilesMatch ".(gif|jpg|png|jpeg)">
</FilesMatch>
作為網(wǎng)站管理員,最大的希望就是能夠保護(hù)網(wǎng)站上所有文檔,但是從技術(shù)角度考慮這種想法是不現(xiàn)實(shí)的,因此我們這里只討論對(duì)圖片文件的保護(hù)。作為保護(hù)的第一步,首先需要標(biāo)識(shí)出需要保護(hù)的文件,然后才能進(jìn)一步對(duì)被標(biāo)識(shí)的文件進(jìn)行保護(hù)。
Referer HTTP頭字段
當(dāng)用戶訪問Web服務(wù)器請(qǐng)求一個(gè)頁(yè)面時(shí),用戶瀏覽器發(fā)送的HTTP請(qǐng)求中會(huì)有一個(gè)被稱為HTTP請(qǐng)求頭(HTTP Request Header)的信息,這個(gè)頭信息中包含客戶請(qǐng)求的一些信息,例如發(fā)出請(qǐng)求客戶主機(jī)的瀏覽器版本、用戶語(yǔ)言、用戶操作系統(tǒng)平臺(tái)、用戶請(qǐng)求的文檔名等,這些信息以變量名/變量值的方式被傳輸。
在這些信息中,Referer字段對(duì)于實(shí)現(xiàn)防止圖片盜用非常重要。Referer字段指定客戶端最后一個(gè)頁(yè)面的URL地址。例如,如果用戶訪問頁(yè)面A,然后點(diǎn)擊在頁(yè)面A上到頁(yè)面B的鏈接,訪問頁(yè)面B的HTTP請(qǐng)求會(huì)包括一個(gè)Referer字段,該字段會(huì)包括這樣的信息“這個(gè)請(qǐng)求是來(lái)自于頁(yè)面A”。如果一個(gè)請(qǐng)求不是來(lái)自于某個(gè)頁(yè)面,而是用戶通過直接在瀏覽器地址欄輸入頁(yè)面A的URL地址的方式來(lái)訪問頁(yè)面A,那么在HTTP請(qǐng)求中則不會(huì)包括Referer字段。這樣對(duì)于我們防止盜鏈有什么幫助呢?Referer字段是幫助判斷對(duì)圖像的請(qǐng)求是來(lái)自自己的頁(yè)面,還是來(lái)自其它網(wǎng)站。
使用SetEnvIf對(duì)圖像進(jìn)行標(biāo)記
SetEnvIfNoCase Referer "^http://my.apache.org/" local_ref=1
作為一個(gè)簡(jiǎn)單的例子,假設(shè)需要保護(hù)的網(wǎng)站的主頁(yè)面為http://my.apache.org,這時(shí)候希望限制所有不是源于本網(wǎng)站的網(wǎng)絡(luò)訪問請(qǐng)求(例如只允許訪問包含在本網(wǎng)站頁(yè)面內(nèi)的圖片)。
當(dāng)Apache處理一個(gè)請(qǐng)求時(shí),它會(huì)檢查HTTP請(qǐng)求頭中的Referer字段,如果該請(qǐng)求來(lái)源于本網(wǎng)站(也就是請(qǐng)求頁(yè)面的URL為本網(wǎng)站域名),則設(shè)置環(huán)境變量local_ref為1。
在雙引號(hào)中的字符串是一個(gè)正則表達(dá)式,只有匹配該正則表達(dá)式,環(huán)境變量才會(huì)被設(shè)置。本文不討論如何使用正則表達(dá)式,這里只需要理解SetEnvIf*命令會(huì)使用正則表達(dá)式作為參數(shù)。
SetEnvIfNoCase命令的“NoCase”部分表示這里的正則表達(dá)式忽略大小寫,'http://my.apache.org/'、'http://My.Apache.Org/'或 'http://MY.APACHE.ORG/'都可以匹配條件。
允許其它網(wǎng)站的友情連接引用本站logo
SetEnvIf Request_URI "(.)*logo" local_ref=0
表示不在SetEnvIfNoCase Referer "^http://my.apache.org/" local_ref=1范圍內(nèi),但可以被放行的特例,本例表示url中包含logo字樣即可訪問。
在訪問控制中使用環(huán)境變量
Order Allow,Deny
Allow from env=local_ref
Apache配置文件中的Order、Allow和Deny命令可以實(shí)現(xiàn)對(duì)文檔的基于環(huán)境變量的訪問控制,使用Order、Allow和Deny命令首先要考慮的是Allow和Deny命令的順序?qū)τ贏pache處理結(jié)果的影響,應(yīng)該以下面的方式使用:
Order Allow,Deny
這里表示Apache首先處理該HTTP請(qǐng)求相關(guān)的Allow命令,然后處理相關(guān)的Deny命令。這種處理方式的默認(rèn)策略是Deny,所以除非有明確的允許的設(shè)置,否則該請(qǐng)求就會(huì)被拒絕,任何非法訪問將無(wú)法成功。
Allow from env=local_ref
這樣只有在local_ref變量被定義的情況下,該請(qǐng)求才會(huì)被允許;否則其它所有請(qǐng)求和訪問將會(huì)被拒絕,因?yàn)檫@些請(qǐng)求不滿足Allow條件。
注意,請(qǐng)不要在.htaccess和httpd.conf中使用容器命令,這里不需要該容器命令,除非有特殊的需求,例如希望Get請(qǐng)求和Post請(qǐng)求進(jìn)行不同的處理。
對(duì)圖片進(jìn)行水印處理
上面介紹的方法并不能完全防止圖像盜鏈,這是因?yàn)橛行﹫?zhí)著的盜用者可以偽造Referer值來(lái)盜用圖片,使相關(guān)設(shè)置失效,所以不可能完全防止網(wǎng)站圖片被盜鏈,但是上面采取的措施會(huì)使得盜鏈變得很困難。
此外,還有一個(gè)防止圖片被盜用的方法,就是對(duì)網(wǎng)站的圖片都進(jìn)行水印處理。對(duì)一個(gè)數(shù)字圖片進(jìn)行水印處理是指在圖片中加入一個(gè)特殊的簽名編碼,并且可以進(jìn)行驗(yàn)證和檢測(cè),數(shù)字水印并不會(huì)降低圖片的質(zhì)量,甚至可以實(shí)現(xiàn)圖像被切割以后的剩余部分仍然會(huì)包括水印信息。圖片被再次編輯、打印,并再次掃描以后,水印仍然可以被檢測(cè)到。因此,水印技術(shù)是一個(gè)非常好的保護(hù)圖片不被盜用的技術(shù)。
記錄盜用請(qǐng)求
SetEnvIfNoCase Referer "!^http://my.apache.org/" not_local_ref=1
SetEnvIfNoCase Request_URI ".(gif|jpg)" is_image=1
RewriteEngine On
RewriteCond ${ENV:not_local_ref} =1
RewriteCond ${ENV:is_image} =1
RewriteRule .* - [Last,Env=poach_attempt:1]
CustomLog logs/poachers_log CLF env=poach_attempt
在httpd.conf文件中添加如上命令,會(huì)在 apache安裝路徑/logs/poachers_log文件中記錄所有具有非法的Referer頭信息的訪問請(qǐng)求
在上面代碼中,頭兩行為條件設(shè)置標(biāo)記(也就是沒有正確的本地Referer的圖片文件),RewriteCond檢測(cè)是否該標(biāo)記被設(shè)置,然后RewriteRule設(shè)置第三個(gè)標(biāo)記,最后一行使得這樣的訪問請(qǐng)求被記錄在特定的文件中。