參考鏈接:https://www.cnblogs.com/an-wen/p/11180076.html
? ? ? ? ? ? ? ? ? ?https://www.cnblogs.com/ranyonsue/p/5984001.html
1.Referer
1.1什么是Refere
該Referer會(huì)告訴服務(wù)器正在發(fā)送的這個(gè)數(shù)據(jù)包是從哪個(gè)頁面鏈接過來的敛熬,服務(wù)器基此可以獲得一些信息用于處理豹爹。
1.2? ??Referer作用是什么?——?指明一個(gè)請(qǐng)求是從哪里鏈接過來 浪蹂,從而限制資源的訪問
????1)防盜鏈
? 比如辦事通服務(wù)器只允許網(wǎng)站訪問自己的靜態(tài)資源抵栈,那服務(wù)器每次都需要判斷Referer的值是否是zwfw.yn.gov.cn,如果是就繼續(xù)訪問坤次,不是就攔截古劲。
? ? ? 可用來防cscrf,但是缺陷比較大缰猴,容易繞過产艾,因?yàn)槭褂胷eferer做訪問限制時(shí),多是限制在同一個(gè)域內(nèi)滑绒,而訪問攻擊鏈接時(shí)多半是從同一個(gè)域跳轉(zhuǎn)闷堡。
????2)防止惡意請(qǐng)求
????比如靜態(tài)請(qǐng)求是.html結(jié)尾的,動(dòng)態(tài)請(qǐng)求是.shtml疑故,那么所有的*.shtml請(qǐng)求缚窿,必須 Referer為我自己的網(wǎng)站才可以訪問,這就是Referer的作用焰扳。
1.3空Referer是怎么回事倦零?
????空Referer是指Referer頭部的內(nèi)容為空,或者吨悍,一個(gè)HTTP 請(qǐng)求頭中根本不包含Referer扫茅,那么什么時(shí)候HTTP請(qǐng)求會(huì)不包含Referer字段呢?
????根據(jù)Referer的定義育瓜,它的作用是指示一個(gè)請(qǐng)求是從哪里鏈接過來葫隙,那么當(dāng)一個(gè)請(qǐng)求并不是由鏈接觸發(fā)產(chǎn)生的,那么自然也就不需要指定這個(gè)請(qǐng)求的鏈接來源躏仇。
????比如恋脚,直接在瀏覽器的地址欄中輸入一個(gè)資源的URL地址,那么這種請(qǐng)求是不會(huì)包含Referer字段的焰手,因?yàn)檫@是一個(gè)“憑空產(chǎn)生”的HTTP請(qǐng)求糟描,并不是從一個(gè)地方鏈接過去的。
在防盜鏈設(shè)置中书妻,允許空Referer和不允許空Referer有什么區(qū)別船响?
????允許Referer為空,意味著你允許比如瀏覽器直接訪問躲履,就是空见间。
1.4 疑問:刪除Referer后依然能訪
解:該服務(wù)器不限制訪問
2. URL
????HTTP使用統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifiers, URI)來傳輸數(shù)據(jù)和建立連接。URL是一種特殊類型的URI工猜,包含了用于查找某個(gè)資源的足夠的信息
URL,全稱是UniformResourceLocator, 中文叫統(tǒng)一資源定位符,是互聯(lián)網(wǎng)上用來標(biāo)識(shí)某一處資源的地址米诉。以下面這個(gè)URL為例,介紹下普通URL的各部分組成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
從上面的URL可以看出篷帅,一個(gè)完整的URL包括以下幾部分:
? ??1.協(xié)議部分:該URL的協(xié)議部分為“http:”史侣,這代表網(wǎng)頁使用的是HTTP協(xié)議汗销。在Internet中可以使用多種協(xié)議,如HTTP抵窒,F(xiàn)TP等等本例中使用的是HTTP協(xié)議弛针。在"HTTP"后面的“//”為分隔符
? ??2.域名部分:該URL的域名部分為“www.aspxfans.com”。一個(gè)URL中李皇,也可以使用IP地址作為域名使用
? ??3.端口部分:跟在域名后面的是端口削茁,域名和端口之間使用“:”作為分隔符。端口不是一個(gè)URL必須的部分掉房,如果省略端口部分茧跋,將采用默認(rèn)端口
? ??4.虛擬目錄部分:從域名后的第一個(gè)“/”開始到最后一個(gè)“/”為止,是虛擬目錄部分卓囚。虛擬目錄也不是一個(gè)URL必須的部分瘾杭。本例中的虛擬目錄是“/news/”
? ??5.文件名部分:從域名后的最后一個(gè)“/”開始到“?”為止哪亿,是文件名部分粥烁,如果沒有“?”,則是從域名后的最后一個(gè)“/”開始到“#”為止,是文件部分蝇棉,如果沒有“讨阻?”和“#”,那么從域名后的最后一個(gè)“/”開始到結(jié)束篡殷,都是文件名部分钝吮。本例中的文件名是“index.asp”。文件名部分也不是一個(gè)URL必須的部分板辽,如果省略該部分奇瘦,則使用默認(rèn)的文件名
????6.錨部分:從“#”開始到最后,都是錨部分劲弦。本例中的錨部分是“name”耳标。錨部分也不是一個(gè)URL必須的部分
????7.參數(shù)部分:從“?”開始到“#”為止之間的部分為參數(shù)部分瓶您,又稱搜索部分麻捻、查詢部分纲仍。本例中的參數(shù)部分為“boardID=5&ID=24618&page=1”呀袱。參數(shù)可以允許有多個(gè)參數(shù),參數(shù)與參數(shù)之間用“&”作為分隔符郑叠。
以http://www.luffycity.com:80/news/index.html?id=250&page=1 為例, 其中:
http夜赵,是協(xié)議;
www.luffycity.com乡革,是服務(wù)器寇僧;
80摊腋,是服務(wù)器上的默認(rèn)網(wǎng)絡(luò)端口號(hào),默認(rèn)不顯示;
/news/index.html,是路徑(URI:直接定位到對(duì)應(yīng)的資源)硝清;
?id=250&page=1百炬,是查詢。
大多數(shù)網(wǎng)頁瀏覽器不要求用戶輸入網(wǎng)頁中“http://”的部分西轩,因?yàn)榻^大多數(shù)網(wǎng)頁內(nèi)容是超文本傳輸協(xié)議文件。同樣,“80”是超文本傳輸協(xié)議文件的常用端口號(hào)岛啸,因此一般也不必寫明。一般來說用戶只要鍵入統(tǒng)一資源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了茴肥。
由于超文本傳輸協(xié)議允許服務(wù)器將瀏覽器重定向到另一個(gè)網(wǎng)頁地址坚踩,因此許多服務(wù)器允許用戶省略網(wǎng)頁地址中的部分,比如 www瓤狐。從技術(shù)上來說這樣省略后的網(wǎng)頁地址實(shí)際上是一個(gè)不同的網(wǎng)頁地址瞬铸,瀏覽器本身無法決定這個(gè)新地址是否通,服務(wù)器必須完成重定向的任務(wù)础锐。
3.http 協(xié)議格式
? ?3.1請(qǐng)求頭格式
????????????????????????????????????????????????????????????????????????????????URL包含:/index/index2?a=1&b=2赴捞;路徑和參數(shù)都在這里。
3.2響應(yīng)頭格式
4.cookie
4.1什么是cookie
cookie不能跨域訪問
http是無狀態(tài)鏈接的協(xié)議(無狀態(tài)是指每次的請(qǐng)求都是單獨(dú)的郁稍,上一次的請(qǐng)求不影響這次的赦政,前后的請(qǐng)求沒有聯(lián)系),所以如果需要保持長時(shí)間的會(huì)話就需要cookie(例如耀怜,登錄頁面之后要保持登陸成功的狀態(tài)恢着,就在服務(wù)器生成一個(gè)cookie然后發(fā)送給客戶端,客戶端想要訪問登錄成功的頁面就發(fā)送cookie+請(qǐng)求信息)
Cookie總是保存在客戶端中财破,按在客戶端中的存儲(chǔ)位置掰派,可分為內(nèi)存Cookie和硬盤Cookie。內(nèi)存Cookie由瀏覽器維護(hù)左痢,保存在內(nèi)存中靡羡,瀏覽器關(guān)閉后就消失了,其存在時(shí)間是短暫的俊性。硬盤Cookie保存在硬盤里略步,有一個(gè)過期時(shí)間,除非用戶手工清理或到了過期時(shí)間定页,硬盤Cookie不會(huì)被刪除趟薄,其存在時(shí)間是長期的。所以典徊,按存在時(shí)間杭煎,可分為非持久Cookie和持久Cookie恩够。
HTTP請(qǐng)求+cookie的交互流程
如果步驟5攜帶的是過期的cookie或者是錯(cuò)誤的cookie,那么將認(rèn)證失敗羡铲,返回至要求身份認(rèn)證頁面蜂桶。
4.2cookie的屬性
一般cookie所具有的屬性,包括:
4.3cooke的作用
4.4cookie的創(chuàng)建
cookie是由服務(wù)端創(chuàng)造的也切,然后服務(wù)器發(fā)送cookie給客戶端
從服務(wù)器端屎飘,發(fā)送cookie給客戶端,是對(duì)應(yīng)的Set-Cookie贾费。包括了對(duì)應(yīng)的cookie的名稱钦购,值,以及各個(gè)屬性褂萧。
Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnlySet-Cookie: made_write_conn=1295214458; Path=/; Domain=.169it.comSet-Cookie: reg_fb_gate=deleted; Expires=Thu, 01 Jan 1970 00:00:01 GMT; Path=/; Domain=.169it.com; HttpOnly
從客戶端把cookie發(fā)送到服務(wù)器
從客戶端發(fā)送cookie給服務(wù)器的時(shí)候押桃,是不發(fā)送cookie的各個(gè)屬性的,而只是發(fā)送對(duì)應(yīng)的名稱和值导犹。
GET /spec.html HTTP/1.1?
Host: www.example.org?
Cookie: name=value; name2=value2?
Accept: */*
4.3Cookie的缺陷
(1)cookie會(huì)被附加在每個(gè)HTTP請(qǐng)求中唱凯,所以無形中增加了流量。
(2)由于在HTTP請(qǐng)求中的cookie是明文傳遞的谎痢,所以安全性成問題磕昼。(除非用HTTPS)
(3)Cookie的大小限制在4KB左右。對(duì)于復(fù)雜的存儲(chǔ)需求來說是不夠用的节猿。
5.session
? ? session(會(huì)話信息)是存放在服務(wù)端(內(nèi)存中)票从,客戶端只在請(qǐng)求的攜帶session_id發(fā)送給服務(wù)端,服務(wù)端接收到session_id后做匹配滨嘱,從而讀取會(huì)話信息,峰鄙;
cookie是放在客戶端(在硬盤或者瀏覽器內(nèi)存中)
session_id可以通過多形式保存在客戶端,對(duì)于瀏覽器客戶端默認(rèn)是保存在cookie當(dāng)中太雨,session_id存放的是一串字符串(身份證)
客戶端發(fā)送請(qǐng)求的時(shí)候?qū)ession_id放在cookie中一起發(fā)送過去吟榴,服務(wù)端再根據(jù)session_id匹配對(duì)應(yīng)的session
6.token
????把userid+隨機(jī)字符串+當(dāng)前時(shí)間進(jìn)行md5加密后生成token,寫入到緩存中囊扳,設(shè)置過期時(shí)間7200秒吩翻,如果過期了就在重新生成token
token算是cookie的升級(jí)版,token一般保存在session中锥咸,如php中狭瞎,$_SESSION['token']=md5(time().rand(1,100000))
(1)客戶端使用用戶名跟密碼請(qǐng)求登錄
(2)服務(wù)端收到請(qǐng)求,去驗(yàn)證用戶名與密碼
(3)驗(yàn)證成功后她君,服務(wù)端會(huì)簽發(fā)一個(gè) token 并把這個(gè) token 發(fā)送給客戶端
(4)客戶端收到 token 以后脚作,會(huì)把它存儲(chǔ)起來,比如放在 cookie 里或者 localStorage 里
(5)客戶端每次向服務(wù)端請(qǐng)求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的 token(每次的token值都不同)
(6)服務(wù)端收到請(qǐng)求缔刹,然后去驗(yàn)證客戶端請(qǐng)求里面帶著的 token 球涛,如果驗(yàn)證成功,就向客戶端返回請(qǐng)求的數(shù)據(jù)
? ??每一次請(qǐng)求都需要攜帶 token校镐,需要把 token 放到 HTTP 的 Header 里
基于 token 的用戶認(rèn)證是一種服務(wù)端無狀態(tài)的認(rèn)證方式亿扁,服務(wù)端不用存放 token 數(shù)據(jù)。用解析 token 的計(jì)算時(shí)間換取 session 的存儲(chǔ)空間鸟廓,從而減輕服務(wù)器的存儲(chǔ)壓力从祝,減少頻繁的查詢數(shù)據(jù)庫,但會(huì)增加cpu的使用引谜,token 完全由應(yīng)用管理牍陌,所以它可以避開同源策略