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

HTTP-REFERER這個(gè)變量已經(jīng)越來(lái)越不可靠了,完全就是可以偽造出來(lái)的東東。
以下是偽造方法:
PHP(前提是裝了curl):
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.d.cn/xxx.asp");
curl_setopt ($ch, CURLOPT_REFERER, "http://www.d.cn/");
curl_exec ($ch);
curl_close ($ch);
PHP(不裝curl用sock)
$server = 'www.dc9.cn';
$host = 'www.dc9.cn';
$target = '/xxx.asp';
$referer = 'http://www.d.cn/'; // Referer
$port = 80;
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp)
{
echo "$errstr ($errno)<br />\n";
}
else
{
$out = "GET $target HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Cookie: ASPSESSIONIDSQTBQSDA=DFCAPKLBBFICDAFMHNKIGKEG\r\n";
$out .= "Referer: $referer\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp))
{
echo fgets($fp, 128);
}
fclose($fp);
}
javascript
xmlHttp.setRequestHeader("Referer", "http://URL");// 呵呵~假的~
JS不支持^_^
原理都是sock構(gòu)造http頭來(lái)senddata。其他語(yǔ)言什么的比如perl也可以,
目前比較簡(jiǎn)單的防御偽造referer的方法是用驗(yàn)證碼(Session)。
現(xiàn)在有一些能防盜鏈軟件的商業(yè)公司比如UUDOG,linkgate,VirtualWall什么的,都是開(kāi)發(fā)的應(yīng)用于IIS上面的dll。
有的是采用cookies驗(yàn)證、線程控制,有的是能隨機(jī)生成文件名然后做URL重寫(xiě)。有的方法能的確達(dá)到不錯(cuò)的效果。
相關(guān)文章
PHP使用imagick讀取PDF生成png縮略圖的兩種方法
這篇文章主要介紹了PHP使用imagick讀取PDF第一頁(yè)生成png縮略圖的兩種方法,使用了PHP擴(kuò)展php_imagick,需要的朋友可以參考下2014-03-03Laravel 使用查詢構(gòu)造器配合原生sql語(yǔ)句查詢的例子
今天小編就為大家分享一篇Laravel 使用查詢構(gòu)造器配合原生sql語(yǔ)句查詢的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10php nginx 實(shí)時(shí)輸出的簡(jiǎn)單實(shí)現(xiàn)方法
本文通過(guò)實(shí)例代碼給大家介紹了php nginx 實(shí)時(shí)輸出的簡(jiǎn)單實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-01-01PHP網(wǎng)頁(yè)游戲?qū)W習(xí)之Xnova(ogame)源碼解讀(十五)
這篇文章主要介紹了PHP網(wǎng)頁(yè)游戲Xnova(ogame)源碼解讀的艦隊(duì)活動(dòng)頁(yè)面處理流程,需要的朋友可以參考下2014-06-06CentOS 上搭建 PHP7 開(kāi)發(fā)測(cè)試環(huán)境
本文給大家分享的是作者在centos上搭建部署php7的開(kāi)發(fā)測(cè)試環(huán)境的全部過(guò)程,非常的細(xì)致,有需要的小伙伴可以參考下2017-02-02Vagrant(WSL)+PHPStorm+Xdebu 斷點(diǎn)調(diào)試環(huán)境搭建
這篇文章主要介紹了Vagrant(WSL)+PHPStorm+Xdebu 斷點(diǎn)調(diào)試環(huán)境搭建,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12thinkPHP框架樂(lè)觀鎖和悲觀鎖實(shí)例分析
這篇文章主要介紹了thinkPHP框架樂(lè)觀鎖和悲觀鎖,結(jié)合實(shí)例形式分析了框架樂(lè)觀鎖和悲觀鎖的原理及thinkPHP相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-10-10PHP頁(yè)面跳轉(zhuǎn)實(shí)現(xiàn)延時(shí)跳轉(zhuǎn)的方法
下面小編就為大家?guī)?lái)一篇PHP頁(yè)面跳轉(zhuǎn)實(shí)現(xiàn)延時(shí)跳轉(zhuǎn)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12php is_executable判斷給定文件名是否可執(zhí)行實(shí)例
這篇文章主要介紹了php is_executable判斷給定文件名是否可執(zhí)行實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-09-09Zend Framework實(shí)現(xiàn)多服務(wù)器共享SESSION數(shù)據(jù)的方法
這篇文章主要介紹了Zend Framework實(shí)現(xiàn)多服務(wù)器共享SESSION數(shù)據(jù)的方法,詳細(xì)分析了SESSION數(shù)據(jù)共享的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03