HTTP Referer二三事---转
授權(quán)方式:署名,非商業(yè)用途,保持一致,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接(http://www.fwolf.com/blog/post/320)的形式標(biāo)明文章原始出處和作者信息及本聲明。
什么是HTTP Referer
簡言之,HTTP Referer是header的一部分,當(dāng)瀏覽器向web服務(wù)器發(fā)送請求的時(shí)候,一般會帶上Referer,告訴服務(wù)器我是從哪個頁面鏈接過來的,服務(wù)器籍此可以獲得一些信息用于處理。比如從我主頁上鏈接到一個朋友那里,他的服務(wù)器就能夠從HTTP Referer中統(tǒng)計(jì)出每天有多少用戶點(diǎn)擊我主頁上的鏈接訪問他的網(wǎng)站。
Referer其實(shí)應(yīng)該是英文單詞Referrer,不過拼錯的人太多了,所以編寫標(biāo)準(zhǔn)的人也就將錯就錯了。
我的問題
我剛剛把feed閱讀器改變?yōu)镚regarius,但他不像我以前用的liferea,訪問新浪博客的時(shí)候,無法顯示其中的圖片,提示“此圖片僅限于新浪博客用戶交流與溝通”,我知道,這就是HTTP Referer導(dǎo)致的。
由于我上網(wǎng)客戶端配置的特殊性,首先懷疑是squid的問題,但通過實(shí)驗(yàn)排除了,不過同時(shí)發(fā)現(xiàn)了一個Squid和Tor、Privoxy協(xié)同使用的隱私泄露問題,留待以后研究。
Gregarius能處理這個問題么?
答案是否定的,因?yàn)镚regarius只是負(fù)責(zé)輸出html代碼,而對圖像的訪問是有客戶端瀏覽器向服務(wù)器請求的。
不過,安裝個firefox擴(kuò)展也許能解決問題,文中推薦的”Send Referrer”我沒有找到,但發(fā)現(xiàn)另外一個可用的:”RefControl“,可以根據(jù)訪問網(wǎng)站的不同,控制使用不同的Referer。
但是我不喜歡用Firefox擴(kuò)展來解決問題,因?yàn)槲矣X得他效率太低,所以我用更好的方式——Privoxy。
Privoxy真棒
在Privoxy的default.action中添加兩行:
{+hide-referrer{forge}} .album.sina.com.cn這樣Gregarius中新浪博客的圖片就出來了吧?+hide-referrer是Privoxy的一個過濾器,設(shè)置訪問時(shí)對HTTP Referer的處理方式,后面的forge代表用訪問地址當(dāng)作Refere的,還可以換成block,代表取消Referer,或者直接把需要用的Referer網(wǎng)址寫在這里。
用Privoxy比用Firefox簡單的多,趕緊換吧。
From https to http
我還發(fā)現(xiàn),從一個https頁面上的鏈接訪問到一個非加密的http頁面的時(shí)候,在http頁面上是檢查不到HTTP Referer的,比如當(dāng)我點(diǎn)擊自己的https頁面下面的w3c xhtml驗(yàn)證圖標(biāo)(網(wǎng)址為http://validator.w3.org/check?uri=referer),從來都無法完成校驗(yàn),提示:
No Referer header found!原來,在http協(xié)議的rfc文檔中有定義:
15.1.3 Encoding Sensitive Information in URI's...Clients SHOULD NOT include a Referer header field in a (non-secure)HTTP request if the referring page was transferred with a secureprotocol.這樣是出于安全的考慮,訪問非加密頁時(shí),如果來源是加密頁,客戶端不發(fā)送Referer,IE一直都是這樣實(shí)現(xiàn)的,Firefox瀏覽器也不例外。但這并不影響從加密頁到加密頁的訪問。
Firefox中關(guān)于Referer的設(shè)置
都在里,有兩個鍵值:
-
network.http.sendRefererHeader (default=2) 設(shè)置Referer的發(fā)送方式,0為完全不發(fā)送,1為只在點(diǎn)擊鏈接時(shí)發(fā)送,在訪問頁面中的圖像什么的時(shí)候不發(fā)送,2為始終發(fā)送。參見Privacy Tip #3: Block Referer Headers in Firefox
-
network.http.sendSecureXSiteReferrer (default=true) 設(shè)置從一個加密頁訪問到另外一個加密頁的時(shí)候是否發(fā)送Referer,true為發(fā)送,false為不發(fā)送。
利用Referer防止圖片盜鏈
雖然Referer并不可靠,但用來防止圖片盜鏈還是足夠的,畢竟不是每個人都會修改客戶端的配置。實(shí)現(xiàn)一般都是通過apache的配置文件,首先設(shè)置允許訪問的地址,標(biāo)記下來:
# 只允許來自domain.com的訪問,圖片可能就放置在domain.com網(wǎng)站的頁面上 SetEnvIfNoCase Referer "^http://www.domain.com/" local_ref # 直接通過地址訪問 SetEnvIf Referer "^$" local_ref然后再規(guī)定被標(biāo)記了的訪問才被允許:
<FilesMatch ".(gif|jpg)"> Order Allow,Deny Allow from env=local_ref </FilesMatch>或者
<Directory /web/images>Order Deny,AllowDeny from allAllow from env=local_ref </Directory>這方面的文章網(wǎng)上很多,參考:
- Apache 下防止盜鏈的解決辦法
- Apache的環(huán)境變量設(shè)置
- 配置 Apache 實(shí)現(xiàn)禁止圖片盜鏈
不要使用Rerferer的地方
不要把Rerferer用在身份驗(yàn)證或者其他非常重要的檢查上,因?yàn)镽erferer非常容易在客戶端被改變,不管是通過上面介紹的Firefox擴(kuò)展,或者是Privoxy,甚至是libcurl的調(diào)用,所以Rerferer數(shù)據(jù)非常之不可信。
如果你想限制用戶必須從某個入口頁面訪問的話,與其使用Referer,不如使用session,在入口頁面寫入session,然后在其他頁面檢查,如果用戶沒有訪問過入口頁面,那么對應(yīng)的session就不存在,參見這里的討論。不過和上面說的一樣,也不要過于相信這種方式的“驗(yàn)證”結(jié)果。
個人感覺現(xiàn)在Rerferer除了用在防盜鏈,其他用途最多的就是訪問統(tǒng)計(jì),比如統(tǒng)計(jì)用戶都是從哪里的鏈接訪問過來的等等。
?
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3577863.html
總結(jié)
以上是生活随笔為你收集整理的HTTP Referer二三事---转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SimpleUrlHandlerMapp
- 下一篇: linux文件操作命令--转