網站圖像防盜Apache配置有妙法



這是一篇轉貼文章,原文章網址:http://www.helzone.com/vbb/archive/index.php/t-53024.html

[ 原文章內容 ]
作者:梅麗 發文時間:2004.12.10

每個網站所有者都在盡力美化自己的網站,使它看上去更酷、更具有吸引力,其中最常見的方法就是使用圖片、Logo及Flash等。但是,這也會帶來一個問題,因為越漂亮、越吸引人的網站,漂亮的圖片和Flash等就容易被別的網站悄悄的盜用。下面我們就一起討論如何防止網站圖像被盜用。

需要解決的問題

簡單的說,這裏有兩種不同的盜用行為:
1. 使用HTML標記IMG在自己的網站中引用網站的圖片。
2. 從網站上下載圖片,然後放在自己的網站上。

對於第一種的盜用行為,合法網站的圖片被用來美化裝飾其他網站,這種盜用對合法網站的損害比較大,因為訪問非法網站的訪問者其實是從合法網站獲取圖片的,合法網站的日誌檔充滿了訪問請求記錄,並且帶寬被非法訪問消耗,而合法網站卻沒有得到任何好處。這種類型的盜用通過技術手段完全可以被防止。

第二種類型的盜用相對來說比較陰險,瀏覽者在非法網站直接訪問非法的圖片,而合法網站的版權受到侵害,卻得不到賠償,甚至無法發現這種盜用。因為Web的工作方式對這種類型的盜用實際上無法被阻止,但是可以使得這種盜用更加困難。

完全杜絕這兩種盜用行為是不現實的,但是通過技術手段可以使得這種盜用非常困難。在Apache環境下,通過設定可以限制網站圖片被盜用。

標識需要保護的檔

作為網站管理員,最大的希望就是能夠保護網站上所有文檔,但是從技術角度考慮這種想法是不現實的,因此我們這裏只討論對圖片檔的保護。

作為保護的第一步,首先需要標識出需要保護的檔,然後才能進一步對被標識的檔進行保護。在Apache設定檔中添加如下內容:

<FilesMatch “\.(gif|jpg)”> [這裏添加保護限制命令]
</FilesMatch>
將容器命令包含在或等容器中,或者單獨列出,不處於任何保護容器中,這樣就會對網站所有檔進行保護,甚至可以存放在.htaccess文件。將該容器放在不同的位置,保護的範圍機會有所不同。

Referer HTTP頭欄位

當用戶訪問Web伺服器請求一個頁面時,用戶瀏覽器發送的HTTP請求中會有一個被稱為HTTP請求頭(HTTP Request Header)的資訊,這個頭資訊中包含客戶請求的一些資訊,例如發出請求客戶主機的瀏覽器版本、用戶語言、用戶作業系統平臺、用戶請求的文檔名等,這些資訊以變數名/變數值的方式被傳輸。

在這些資訊中,Referer欄位對於實現防止圖片盜用非常重要。Referer欄位指定用戶端最後一個頁面的URL位址。例如,如果用戶訪問頁面A,然後點擊在頁面A上到頁面B的鏈結,訪問頁面B的HTTP請求會包括一個Referer欄位,該欄位會包括這樣的資訊“這個請求是來自於頁面A”。如果一個請求不是來自於某個頁面,而是用戶通過直接在瀏覽器位址欄輸入頁面A的URL位址的方式來訪問頁面A,那麼在HTTP請求中則不會包括Referer欄位。這樣對於我們防止盜連有什麼幫助呢?Referer欄位是幫助判斷對圖像的請求是來自自己的頁面,還是來自其他網站。

使用SetEnvIf對圖像進行標記

作為一個簡單的例子,假設需要保護的網站的主頁面為http://my.apache.org,這時候希望限制所有不是源於本網站的網路訪問請求(例如只允許訪問包含在本網站頁面內的圖片)。這裏可以使用一個環境變數作為一個標記,如果條件滿足時就設置該變數,如下所示:

SetEnvIfNoCase Referer “^http://my\.apache\.org/” local_ref=1
當Apache處理一個請求時,它會檢查HTTP請求頭中的Referer欄位,如果該請求來源於本網站(也就是請求頁面的URL為本網站功能變數名稱),則設置環境變數local_ref為1。

在雙引號中的字串是一個正則運算式,只有匹配該正則運算式,環境變數才會被設置。本文不討論如何使用正則運算式,這裏只需要理解SetEnvIf*命令會使用正則運算式作為參數。

SetEnvIfNoCase命令的“NoCase”部分表示這裏的正則運算式忽略大小寫,’http://my.apache.org/’、’http://My.Apache.Org/’或 ‘http://MY.APACHE.ORG/’都可以匹配條件。

在訪問控制中使用環境變數

Apache設定檔中的Order、Allow和Deny命令可以實現對文檔的基於環境變數的訪問控制,使用Order、Allow和Deny命令首先要考慮的是Allow和Deny命令的順序對於Apache處理結果的影響,應該以下面的方式使用:
Order Allow,Deny

這裏表示Apache首先處理該HTTP請求相關的Allow命令,然後處理相關的Deny命令。這種處理方式的預設策略是Deny,所以除非有明確的允許的設置,否則該請求就會被拒絕,任何非法訪問將無法成功。

因此,在Apache的設定檔httpd.conf中添加如下命令,來實現本地引用發揮作用:

Order Allow,Deny
Allow from env=local_ref
這樣只有在local_ref變數被定義的情況下,該請求才會被允許;否則其他所有請求和訪問將會被拒絕,因為這些請求不滿足Allow條件。

注意,請不要在.htaccess和httpd.conf中使用容器命令,這裏不需要該容器命令,除非有特殊的需求,例如希望Get請求和Post請求進行不同的處理。

把這些相關設置放在一起,在Apache的設定檔中就會有如下內容:

SetEnvIfNoCase Referer “^http://my\.apache\.org/” local_ref=1
<FilesMatch “\.(gif|jpg)”>
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
如上設定可以存放在伺服器設定檔httpd.conf中,或者存放在.htaccess檔中,最後的效果是一樣的:在這些命令作用的範圍內,只有從本網站引用的圖片才可以被訪問。

對圖片進行浮水印處理

上面介紹的方法並不能完全防止圖像盜連,這是因為有些執著的盜用者可以偽造Referer值來盜用圖片,使相關設置失效,所以不可能完全防止網站圖片被盜連,但是上面採取的措施會使得盜連變得很困難。

此外,還有一個防止圖片被盜用的方法,就是對網站的圖片都進行浮水印處理。對一個數位圖片進行浮水印處理是指在圖片中加入一個特殊的簽名編碼,並且可以進行驗證和檢測,數位浮水印並不會降低圖片的品質,甚至可以實現圖像被切割以後的剩餘部分仍然會包括浮水印資訊。圖片被再次編輯、列印,並再次掃描以後,浮水印仍然可以被檢測到。因此,浮水印技術是一個非常好的保護圖片不被盜用的技術。

記錄盜用請求

如果想知道自己網站的藝術品是否被盜,可以嘗試使用同樣的偵測和環境變數來記錄可疑請求。例如,在httpd.conf檔中添加如下命令,那麼會在 /usr/local/web/apache/logs/poachers_log檔中記錄所有具有非法的Referer頭資訊的訪問請求:

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
在上面代碼中,頭兩行為條件設置標記(也就是沒有正確的本地Referer的圖片檔),RewriteCond檢測是否該標記被設置,然後RewriteRule設置第三個標記,最後一行使得這樣的訪問請求被記錄在特定的檔中。

上面簡單介紹了在Apache環境下,如何通過設定來限制網站圖片被盜用的方法,?磚引玉,希望大家將自己更好的經驗介紹出來。

Leave a Reply

CAPTCHA 驗證圖片
更換一張圖片