php語言

當前位置 /首頁/計算機/php語言/列表

使用php偽造referer的方法

當瀏覽器向web伺服器傳送請求的時候,一般會帶上Referer,告訴伺服器我是從哪個頁面連結過來的,伺服器籍此可以獲得一些資訊用於處理,不過這個Referer是可以偽造。下面是小編為大家帶來的使用php偽造referer的方法,歡迎閱讀

使用php偽造referer的方法
  使用php偽造referer的方法

什麼是HTTP Referer

簡言之,HTTP Referer是header的一部分,當瀏覽器向web伺服器傳送請求的時候,一般會帶上Referer,告訴伺服器我是從哪個頁面連結過來的,伺服器籍此可以獲得一些資訊用於處理。比如從我主頁上鍊接到一個朋友那裡,他的伺服器就能夠從HTTP Referer中統計出每天有多少使用者點選我主頁上的連結訪問他的網站。

Referer其實應該是英文單詞Referrer,不過拼錯的人太多了,所以編寫標準的人也就將錯就錯了。

 我的問題

我剛剛把feed閱讀器改變為Gregarius,但他不像我以前用的liferea,訪問新浪部落格的時候,無法顯示其中的圖片,提示“此圖片僅限於新浪部落格使用者交流與溝通”,我知道,這就是HTTP Referer導致的。

由於我上網客戶端配置的特殊性,首先懷疑是squid的問題,但通過實驗排除了,不過同時發現了一個Squid和Tor、Privoxy協同使用的隱私洩露問題,留待以後研究。

Gregarius能處理這個問題麼?

答案是否定的,因為Gregarius只是負責輸出html程式碼,而對影象的訪問是有客戶端瀏覽器向伺服器請求的。

不過,安裝個firefox擴充套件也許能解決問題,文中推薦的”Send Referrer”我沒有找到,但發現另外一個可用的:”RefControl“,可以根據訪問網站的不同,控制使用不同的Referer。

但是我不喜歡用Firefox擴充套件來解決問題,因為我覺得他效率太低,所以我用更好的方式——Privoxy。

Privoxy真棒

在Privoxy的on中新增兩行:

{+hide-referrer{forge}}

這樣Gregarius中新浪部落格的圖片就出來了吧?+hide-referrer是Privoxy的一個過濾器,設定訪問時對HTTP Referer的處理方式,後面的forge代表用訪問地址當作Refere的,還可以換成block,代表取消Referer,或者直接把需要用的Referer網址寫在這裡。

用Privoxy比用Firefox簡單的多,趕緊換吧。

 From https to http

我還發現,從一個https頁面上的連結訪問到一個非加密的http頁面的時候,在http頁面上是檢查不到HTTP Referer的,比如當我點選自己的https頁面下面的w3c xhtml驗證圖示(網址為http://XXX),從來都無法完成校驗,提示:

No Referer header found!

原來,在http協議的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.

這樣是出於安全的考慮,訪問非加密頁時,如果來源是加密頁,客戶端不傳送Referer,IE一直都是這樣實現的,Firefox瀏覽器也不例外。但這並不影響從加密頁到加密頁的訪問。

 Firefox中關於Referer的設定

都在裡,有兩個鍵值:

RefererHeader (default=2) 設定Referer的傳送方式,0為完全不傳送,1為只在點選連結時傳送,在訪問頁面中的影象什麼的時候不傳送,2為始終傳送。參見Privacy Tip #3: Block Referer Headers in Firefox

SecureXSiteReferrer (default=true) 設定從一個加密頁訪問到另外一個加密頁的時候是否傳送Referer,true為傳送,false為不傳送。

  利用Referer防止圖片盜鏈

雖然Referer並不可靠,但用來防止圖片盜鏈還是足夠的,畢竟不是每個人都會修改客戶端的配置。實現一般都是通過apache的配置檔案,首先設定允許訪問的地址,標記下來:

# 只允許來自的訪問,圖片可能就放置在網站的頁面上

SetEnvIfNoCase Referer "^" local_ref

# 直接通過地址訪問

SetEnvIf Referer "^$" local_ref

然後再規定被標記了的訪問才被允許:

程式碼如下:

<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用在身份驗證或者其他非常重要的檢查上,因為Rerferer非常容易在客戶端被改變,不管是通過上面介紹的Firefox擴充套件,或者是Privoxy,甚至是libcurl的.呼叫,所以Rerferer資料非常之不可信。

如果你想限制使用者必須從某個入口頁面訪問的話,與其使用Referer,不如使用session,在入口頁面寫入session,然後在其他頁面檢查,如果使用者沒有訪問過入口頁面,那麼對應的session就不存在,參見這裡的討論。不過和上面說的一樣,也不要過於相信這種方式的“驗證”結果。

個人感覺現在Rerferer除了用在防盜鏈,其他用途最多的就是訪問統計,比如統計使用者都是從哪裡的連結訪問過來的等等。

HTTP-REFERER這個變數已經越來越不可靠了,完全就是可以偽造出來的東東。

以下是偽造方法:

PHP(前提是裝了curl):

程式碼如下:

$ch = curl_init();

curl_setopt ($ch, CURLOPT_URL, "");

curl_setopt ($ch, CURLOPT_REFERER, "");

curl_exec ($ch);

curl_close ($ch);

PHP(不裝curl用sock)

$server = '';

$host = '';

$target = '/';

$referer = ''; // Referer

$port = 80;

$fp = fsockopen($server, $port, $errno, $errstr, 30);

if (!$fp)

{

echo "$errstr ($errno)<br />n";

}

else

{

$out = "GET $target HTTP/1.1rn";

$out .= "Host: $hostrn";

$out .= "Cookie: ASPSESSIONIDSQTBQSDA=DFCAPKLBBFICDAFMHNKIGKEGrn";

$out .= "Referer: $refererrn";

$out .= "Connection: Closernrn";

fwrite($fp, $out);

while (!feof($fp))

{

echo fgets($fp, 128);

}

fclose($fp);

}

javascript

equestHeader("Referer", "http://URL");// 呵呵~假的~

JS不支援^_^

原理都是sock構造http頭來senddata。其他語言什麼的比如perl也可以,

目前比較簡單的防禦偽造referer的方法是用驗證碼(Session)。

現在有一些能防盜鏈軟體的商業公司比如UUDOG,linkgate,VirtualWall什麼的,都是開發的應用於IIS上面的dll。

有的是採用cookies驗證、執行緒控制,有的是能隨機生成檔名然後做URL重寫。有的方法能的確達到不錯的效果.

不過道高一尺,魔高一丈,這些雕蟲小技終歸是有破解方法的。

一般的就是這樣的了,但是伺服器就不好實現偽造,只能製造不多的資料了,如果可以實現訪問網頁就可以偽造,那就可以實現了真正的偽造,實現自然IP分佈。

TAG標籤:referer 偽造 PHP #