HTTP_REFERER的用法及伪造
轉(zhuǎn)自:https://blog.csdn.net/u011250882/article/details/49679535
引言
在php中,可以使用$_SERVER[‘HTTP_REFERER’]來獲取HTTP_REFERER信息,關(guān)于HTTP_REFERER,php文檔中的描述如下:
“引導(dǎo)用戶代理到當(dāng)前頁的前一頁的地址(如果存在)。由 user agent 設(shè)置決定。并不是所有的用戶代理都會設(shè)置該項(xiàng),有的還提供了修改?
HTTP_REFERER 的功能。簡言之,該值并不可信。 ”
在百度百科中,對于該參數(shù)的描述如下:
“HTTP?
Referer是header的一部分,當(dāng)瀏覽器向web服務(wù)器發(fā)送請求的時候,一般會帶上Referer,告訴服務(wù)器我是從哪個頁面鏈接過來的,服務(wù)器籍此可以獲得一些信息用于處理。”
從上面的論述中我們可以得到如下幾點(diǎn)結(jié)論:
HTTP_REFERER的用途
HTTP_REFERER提供了引導(dǎo)用戶代理到當(dāng)前頁的前一頁的地址信息,常見的一些應(yīng)用場景有防盜鏈,統(tǒng)計(jì)文章有多少次是來自谷歌搜索結(jié)果,多少次來自百度搜索結(jié)果等。?
下面以防盜鏈為例,講講HTTP_REFERER的用法。?
如果你經(jīng)常寫博客,就一定會遇到盜用你辛辛苦苦整理過的文章不跟你打任何招呼甚至連原文鏈接都一并抹除的網(wǎng)站,文字這個層面我們沒法控制,但是圖片這個層面我們是可以控制的。舉個例子,如果你也曾復(fù)制過一些類似騰訊等網(wǎng)站的文章,你會發(fā)現(xiàn)黏貼下來發(fā)表之后經(jīng)常出現(xiàn)圖片無法顯示,這是如何做到的呢??
場景:a站點(diǎn)的圖片全部存儲在c站點(diǎn)(云服務(wù)器)上,c站點(diǎn)將識別調(diào)用方是否來自a站點(diǎn),否則顯示一張錯誤圖片,b站是盜圖網(wǎng)站。?
a站和b站的代碼一致,如下所示:
- 1
重點(diǎn)是c站的代碼,如下所示:
<?php if(strpos($_SERVER['HTTP_REFERER'], 'www.a.com') !== false){//以下的寫法并不嚴(yán)謹(jǐn),這里只是做測試if(file_exists($_GET['fname'])){echo file_get_contents($_GET['fname']);} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
這樣當(dāng)a站訪問時圖片可以正常顯示,而b站訪問時圖片是顯示不出來的。
什么時候獲取不到HTTP_REFERER值
綜上所述,HTTP_REFERER存在需要兩個條件:
- 瀏覽器(客戶端)請求(服務(wù)器端請求的情況下,是不存在HTTP_REFERER的,但是可以偽造header,這在下一節(jié)中將提及);
存在前導(dǎo)頁;
以下是網(wǎng)友收集的獲取不到HTTP_REFERER值的情況:
在瀏覽器內(nèi)直接敲URL
- windows桌面上的超鏈接圖標(biāo)
- 瀏覽器內(nèi)書簽
- 第三方軟件(如Word,Excel等)內(nèi)容中的鏈接
- SSL認(rèn)證網(wǎng)站跳入
- http://example.com/“> meta頁面設(shè)置自動跳轉(zhuǎn)時,在example.com將取不到REFERER URL
- 使用JavaScript的Location.href或者是Location.replace()
在以下情況下可以獲取HTTP_REFERER值:
- 直接用
- form提交的表單(POST或GET)
- src請求(如js的script標(biāo)簽及html中img標(biāo)簽的src屬性)
如何偽造HTTP_REFERER
前面提到HTTP_REFERER是可以偽造的,那么在php中,如何偽造HTTP_REFERER呢?有如下三種方法:?
首先是接口代碼:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- curl?
代碼示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
執(zhí)行結(jié)果如下:?
?
偽造成功。
file_get_contents
一直沒怎么用過file_get_contents來發(fā)送post請求,其實(shí)file_get_contents可以發(fā)送任何http請求,后期會針對性的整理一篇文章出來。
代碼示例:
$opts = array('http'=>array('method'=>"GET",'header'=>"Referer: http://www.google.com") );$context = stream_context_create($opts);// Open the file using the HTTP headers set above var_dump(file_get_contents('http://www.c.com/api.php', false, $context));- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
執(zhí)行結(jié)果:?
?
偽造成功
- socket?
代碼示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
執(zhí)行結(jié)果:?
偽造成功。
在做這次測試的時候,第一次執(zhí)行報錯:Your browser sent a request that this server could not understand.?
后來發(fā)現(xiàn)是$out = “GET api.php HTTP/1.1\r\n”;中少了’/’,糾結(jié)了老半天,暈死
總結(jié)
以上是生活随笔為你收集整理的HTTP_REFERER的用法及伪造的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Matlab 线性同余法产生随机数
- 下一篇: bootstrap表单样式