Referer詳解

什麼是Referer?

Referer  是  HTTP  請求header 的一部分,當瀏覽器(或者模擬瀏覽器行爲)向web 服務器發送請求的時候,頭信息裏有包含  Referer  。好比我在www.sojson.com 裏有一個www.baidu.com 連接,那麼點擊這個www.baidu.com ,它的header 信息裏就有:html

    Referer=https://www.sojson.comjava

由此能夠看出來吧。它就是表示一個來源。看下圖的一個請求的 Referer  信息。web

 



這裏有一個小問題要說明下。

Referer  的正確英語拼法是referrer 。因爲早期HTTP規範的拼寫錯誤,爲了保持向後兼容就將錯就錯了。其它網絡技術的規範企圖修正此問題,使用正確拼法,因此目前拼法不統一。還有它第一個字母是大寫。json

 

Referer的做用?

1.防盜鏈。瀏覽器

剛剛前面有提到一個小 Demo  緩存

我在www.sojson.com裏有一個www.baidu.com連接,那麼點擊這個www.baidu.com,它的header信息裏就有:服務器

Referer=https://www.sojson.com

那麼能夠利用這個來防止盜鏈了,好比我只容許我本身的網站訪問我本身的圖片服務器,那個人域名是www.sojson.com,那麼圖片服務器每次取到Referer來判斷一下是否是我本身的域名www.sojson.com,若是是就繼續訪問,不是就攔截。cookie

這是否是就達到防盜鏈的效果了?網絡

2.防止惡意請求。session

好比個人SOJSON網站上,靜態請求是*.html結尾的,動態請求是*.shtml,那麼由此能夠這麼用,全部的*.shtml請求,必須 Referer  爲我本身的網站。

Referer=https://www.sojson.com

空Referer是怎麼回事?什麼狀況下會出現Referer?

首先,咱們對空 Referer  的定義爲, Referer  頭部的內容爲空,或者,一個 HTTP  請求中根本不包含 Referer  頭部。

那麼何時 HTTP  請求會不包含 Referer  字段呢?根據Referer的定義,它的做用是指示一個請求是從哪裏連接過來,那麼當一個請求並非由連接觸發產生的,那麼天然也就不須要指定這個請求的連接來源。

好比,直接在瀏覽器的地址欄中輸入一個資源的URL地址,那麼這種請求是不會包含 Referer  字段的,由於這是一個「憑空產生」的 HTTP  請求,並非從一個地方連接過去的。

那麼在防盜鏈設置中,容許空Referer和不容許空Referer有什麼區別?

容許 Referer  爲空,意味着你容許好比瀏覽器直接訪問,就是空。

以下圖:

這就是空的 Referer  

拒絕空的 Referer  。好比個人www.sojson.com的靜態資源都是拒絕空的Referer 的。以下圖,我訪問個人一個圖片。



看到了吧,直接拒絕訪問了,若是有同窗在測試我網站的靜態資源的時候,記住強制刷新Ctrl + F5 ,由於瀏覽器有緩存,可能你開始仍是能夠訪問的。

固然。這個你不能徹底依賴 Referer  來作一些事情,由於這個最容易僞造來源。

每一個語言,均可以,好比 Java  來模擬一個 Httpclient  請求。而且僞造來源。

 

 
    1. /**
    2. * 從工信部獲取驗證碼
    3. * @param session
    4. * @param response
    5. */
    6. public static void getVCode(HttpSession session,HttpServletResponse response){
    7. InputStream inputStream = null;
    8. ServletOutputStream outStream = null;
    9. try {
    10. //獲取登陸框的隱含參數 type="hidden" name="_xsrf"
    11. HttpClient client = new HttpClient();
    12. client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"UTF-8");
    13. client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
    14. GetMethod method = new GetMethod("http://www.miitbeian.gov.cn/getVerifyCode");
    15. method.setRequestHeader("Connection","close");
    16. method.setRequestHeader("Host", "www.miitbeian.gov.cn");
    17. method.setRequestHeader("Referer", "http://www.miitbeian.gov.cn/icp/publish/query/icpMemoInfo_showPage.action");
    18. method.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0");
    19. // method.setRequestHeader("Cookie", (String)goon);
    20. client.executeMethod(method);
    21. Cookie[] cookies = client.getState().getCookies();
    22. String sid = "",uid="",goon="__jsluid=%s; JSESSIONID=%s";
    23. for (Cookie cookie : cookies) {
    24. String name = cookie.getName();
    25. String value = cookie.getValue();
    26. if("JSESSIONID".equals(name)){
    27. sid = value;
    28. }
    29. if("__jsluid".equals(name)){
    30. uid = value;
    31. }
    32. }
    33. goon = String.format(goon, uid,sid);
    34. //存儲工信部Session信息
    35. session.setAttribute("goon", goon);
    36. inputStream= method.getResponseBodyAsStream();
    37. //獲得圖片的二進制數據,以二進制封裝獲得數據,具備通用性
    38. byte[] data = CacheFindManager.readInputStream(inputStream);
    39. outStream = response.getOutputStream();
    40. outStream.write(data);
    41. outStream.flush() ;
    42. } catch (Exception e) {
    43. LoggerUtils.error(BeianGovManager.class, "獲取驗證碼出現異常。", e);
    44. }finally{
    45. try {
    46. inputStream.close();
    47. outStream.close();
    48. } catch (IOException e) {
    49. LoggerUtils.error(BeianGovManager.class, "獲取驗證碼後,關閉流出現異常,請忽略!", e);
    50. }
    51. }
    52. }

 

 

版權所屬:SO JSON在線解析

原文地址:https://www.sojson.com/blog/58.html

轉載時必須以連接形式註明原始出處及本聲明。

相關文章
相關標籤/搜索