天天看點

通過.htaccess 對網站圖檔的基本防盜處理

前提:公司是個媒體類網站,對于外網圖檔要求一些基本的防盜鍊處理

綜合考慮後采用了 .htaccess 配合 網站鎖右鍵 進行一個基本的防盜鍊處理。

apache如何開啟htaccess?

打開httpd.conf

(1)

Options FollowSymLinks

AllowOverride None

改為

Options FollowSymLinks

AllowOverride All

(2)去掉下面的注釋

LoadModule rewrite_module modules/mod_rewrite.so

1. 基本的圖檔防盜鍊

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^ [NC]
RewriteCond %{HTTP_REFERER} !bicycling.net.cn [NC]
RewriteCond %{HTTP_REFERER} !cycling-update.cn [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteRule .*\.(gif|jpg|jpeg|png)$ http://www.cycling-update.cn/image/logo.png [R,NC,L]
           

2. 網站禁右鍵

<script>
document.oncontextmenu=new Function("event.returnValue=false;"); //禁止右鍵功能,單擊右鍵将無任何反應 
</script>
           
網站禁右鍵可以很簡單通過禁用網頁js搞定,然後還是可以右鍵下載下傳圖檔,還有種辦法通過網頁div覆寫,在img上加上另一個div覆寫,但是也可以通過開發人員工具很簡單就改掉,是以右鍵這個辦法其實隻能防止完全不懂的人,這裡不再多寫

3. 防止使用者直接打開圖檔進行下載下傳

如果使用者有基本的網絡知識,上面這2步進行後,使用者仍然能夠很簡單的通過圖檔源位址打開下載下傳圖檔。

是以還需要修改 .htaccess 檔案

RewriteEngine on
RewriteCond %{HTTP_REFERER} !bicycling.net.cn [NC]
RewriteCond %{HTTP_REFERER} !cycling-update.cn [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteRule .*\.(gif|jpg|jpeg|png)$ http://www.cycling-update.cn/image/logo.png [R,NC,L]
           
//RewriteCond %{HTTP_REFERER} !^ [NC]被去掉了後,使用者無法通過源位址直接打開圖檔
<FilesMatch "\.(gif|jpg|jpeg|png)$">
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
</FilesMatch>
           
//這一段讓網站的圖檔不會進行緩存,其實考慮到網站使用者體驗和SEO優化的話,我們往往是會設定成圖檔緩存時間為1小時左右。但是為了讓使用者無法複制位址後直接從緩存打開圖檔,需要設為no-cache

4. 禁止使用者通過迅雷、快車等下載下傳工具進行圖檔下載下傳

做到這一步的時候,普通使用者除了進行截圖基本沒有其他辦法可以擷取圖檔,我嘗試通過快車下載下傳工具進行原圖下載下傳,結果發現能下載下傳,迅雷下載下傳源圖也是通過http協定。明明無法打開源位址為什麼能下載下傳讓我很費解。

網上百度了對應辦法,都是通過 User-agent 進行來源軟體判斷。如下:

RewriteCond %{HTTP_USER_AGENT} ^flashget [NC]
RewriteRule . abuse.txt [L]
           

但是發現完全沒有效果

最後沒辦法隻能檢視apache的網站日志檔案(var/log/httpd/access_log),發現迅雷下載下傳和快車下載下傳分别為下面2行日志

- - [/Dec/::: +] "GET /data/0000/02/18.jpg HTTP/1.1"   "http://img.bicycling.net.cn/data/0000/02" 
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; GWX:RESERVED)"
           
- - [/Dec/::: +] "GET /data/0000/02/21.jpg HTTP/1.1"   "http://img.bicycling.net.cn/data/0000/02" 
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
           

他們的 User-agent 完全僞裝成了浏覽器的樣子(或者本身就是使用了浏覽器的核心進行http資料通路),完全不提及自身的軟體名或關鍵詞

但是通過日志檔案,發現他們為何能突破我 .htacess 的限定,下面為正常直接打開圖檔的日志,觸發302轉址。

- - [/Dec/::: +] "GET /data/0000/02/09.jpg HTTP/1.1"   "-" 
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36"
           

而下載下傳工具讀取到圖檔位址後會讀取檔案夾,通過檔案夾讀取圖檔下載下傳,而非直接通過位址打開下載下傳。

是以去掉 RewriteCond %{HTTP_REFERER} !^ [NC] 無法防止下載下傳工具。但是可以通過圖檔檔案夾路徑來禁用。

RewriteCond %{HTTP_REFERER} img.bicycling.net.cn/data [NC]
RewriteRule .*\.(gif|jpg|jpeg|png)$ http://www.cycling-update.cn/image/logo.png [R,NC,L]
           

通過上面4步,基本的圖檔防盜工作也完成了,但是當我們業務嘗試把網頁分享到微信朋友圈的時候,會出現無法抓取縮略圖的狀況,當然是被我們禁止掉了

5. 允許微信分享抓取縮略圖

通過讀網站日志檔案發現微信抓取縮略圖的記錄如下:

由于這條指令是直接通過url打開圖檔,是以無法通過referer來打開讀取通道,如果通過IP,理論上也可以在做到限定,但是肯定有很多不便,是以最終隻能選擇通過 User-agent —— “Apache-HttpClient/UNAVAILABLE (java 1.4)”進行通道打開了

最終版 .htaccess 檔案如下:

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !^Apache-HttpClient/UNAVAILABLE [NC]
RewriteCond %{HTTP_REFERER} !bicycling.net.cn [NC]
RewriteCond %{HTTP_REFERER} !cycling-update.cn [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteRule .*\.(gif|jpg|jpeg|png)$ http://www.cycling-update.cn/image/logo.png [R,NC,L]

RewriteCond %{HTTP_REFERER} img.bicycling.net.cn/data [NC]
RewriteRule .*\.(gif|jpg|jpeg|png)$ http://www.cycling-update.cn/image/logo.png [R,NC,L]

<FilesMatch "\.(gif|jpg|jpeg|png)$">
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
</FilesMatch>
           
補充說明:htaccess檔案内置判斷預設為 and,而且似乎隻能進行一層判斷(不可以或的同時與,這個我不是很确定,沒去研究)。是以我對圖檔轉址進行了2次分别操作