1》Refere定義
Referer是HTTP請求header
的一部分,當瀏覽器(或者模擬瀏覽器行為)向web
服務器發送請求的時候,頭信息里有包含Referer 。比如我在www.xxxx.com
里有一個www.baidu.com
鏈接,那么點擊這個www.baidu.com
,它的header
信息里就有:Referer=https://www.xxxx.com信息
2>Refere作用
1.防盜鏈
那么可以利用這個來防止盜鏈了,比如我只允許我自己的網站訪問我自己的圖片服務器,那我的域名是www.xxx.com
,那么圖片服務器每次取到Referer來判斷一下是不是我自己的域名www.xxxx.com
,如果是就繼續訪問,不是就攔截。
2.防止惡意請求。
比如我的網站上,靜態請求是*.html
結尾的,動態請求是*.shtml
,那么由此可以這么用,所有的*.shtml
請求,必須 Referer 為我自己的網站。
3.空Referer是怎么回事?什么情況下會出現Referer?
首先,我們對空 Referer 的定義為, Referer 頭部的內容為空,或者,一個 HTTP 請求中根本不包含 Referer 頭部。
那么什么時候 HTTP 請求會不包含 Referer 字段呢?根據Referer的定義,它的作用是指示一個請求是從哪里鏈接過來,那么當一個請求並不是由鏈接觸發產生的,那么自然也就不需要指定這個請求的鏈接來源。
比如,直接在瀏覽器的地址欄中輸入一個資源的URL地址,那么這種請求是不會包含 Referer 字段的,因為這是一個“憑空產生”的 HTTP 請求,並不是從一個地方鏈接過去的。
4.那么在防盜鏈設置中,允許空Referer和不允許空Referer有什么區別?
允許 Referer 為空,意味着你允許比如瀏覽器直接訪問,就是空。
3>Refere可靠嗎?
Refere不可靠,但有部分作用,起碼增加了爬圖難度和成本,因為在瀏覽器端你是無法指定(偽造),你只能通過定義meta元素告訴瀏覽器怎么用
<meta name="referrer" content="never">
content有如下值:
- 如果 referer-policy 的值為 never:刪除 http head 中的 referer;
- 如果 referer-policy 的值為 default:如果當前頁面使用的是 https 協議,而正要加載資源使用的是普通的 http 協議,則將 http header 中額 referer 置為空;
- 如果 referer-policy 的值 origin:只發送 origin 部分;
- 如果 referer-policy 的值為 always:不改變 http header 中的 referer 的值;
4>Refere偽造
只能在服務器端指定,Refere參數位置在$_SERVER['HTTP_REFERER']
4.1>CURL方法
function curl_post($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, 'http://www.baidu.com'); $output = curl_exec($ch); curl_close($ch); return $output; }
4.2》file_get_contents方法
$opts = array( 'http'=>array( 'method'=>"GET", 'header'=>"Referer: http://www.baidu.com" ) ); $context = stream_context_create($opts); var_dump(file_get_contents('http://www.c.com/api.php', false, $context));