我所理解的HTTP協(xié)議

前言

對(duì)于HTTP協(xié)議鸟赫,想必大家都不陌生,在工作中經(jīng)常用到,特別是針對(duì)移動(dòng)端和前端開發(fā)人員來說幕袱,要獲取服務(wù)端數(shù)據(jù)瘪松,基本走的網(wǎng)絡(luò)請(qǐng)求都是基于HTTP協(xié)議咸作,特別是RESTFUL + JSON 這種搭配特別主流。那如果讓大家具體講講HTTP協(xié)議背后的歷史宵睦、原理记罚、交互流程、與HTTPS區(qū)別壳嚎、身份認(rèn)證桐智、Web攻防技術(shù)等等信息,大家能講的出來嗎烟馅,反正我講的也是一知半解说庭,雖然會(huì)經(jīng)常看這方面的文章郑趁,但也只是在具體項(xiàng)目進(jìn)行開發(fā)過程中碰到對(duì)某個(gè)概念不清楚刊驴,才會(huì)去特意看下,卻沒有特意去總結(jié)歸納為一直知識(shí)點(diǎn)穿撮,沒有完整的表達(dá)描述過缺脉,其實(shí)對(duì)這個(gè)知識(shí)點(diǎn)還是沒掌握好的痪欲,所以用寫作方式來進(jìn)行闡述是很好一個(gè)方式,目前也正在踐行著攻礼。

思維導(dǎo)圖

在寫作之前业踢,這篇文章主要想講的內(nèi)容在以下這張圖中,通過做思維導(dǎo)圖方式來表達(dá)一篇文章內(nèi)容礁扮,我覺得邏輯會(huì)特別清楚知举,同時(shí)也是對(duì)某個(gè)知識(shí)點(diǎn)會(huì)很好進(jìn)行總結(jié)歸納。


HTTP

HTTP歷史

發(fā)展由來

在1989 年 3 月太伊, 互聯(lián)網(wǎng)還只屬于少數(shù)人雇锡。 在這一互聯(lián)網(wǎng)的黎明期, HTTP 誕生了僚焦。CERN( 歐洲核子研究組織)的蒂姆 ? 伯納斯 - 李( Tim BernersLee)博士提出了一種能讓遠(yuǎn)隔兩地的研究者們共享知識(shí)的設(shè)想锰提。 最初設(shè)想 的 基本理念是: 借助多文檔之間相互關(guān)聯(lián)形成的超文本( HyperText),連成可相互參閱的 WWW( World Wide Web芳悲,萬維網(wǎng))立肘。并且版本從 HTTP 1.0 到 HTTP 1.1 再到現(xiàn)在的 HTTP 2.0,目前主流版本還是基于 HTTP 1.1名扛,HTTP 協(xié)議同時(shí)也是目前互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議谅年,所有的 WWW 文件都必須遵守這個(gè)標(biāo)準(zhǔn),設(shè)計(jì)HTTP 最初的目的是為了提供一種發(fā)布和接收 HTML 頁面的方法肮韧。

TCP/IP

我們都知道 HTTP 協(xié)議在 根據(jù) TCP/IP 網(wǎng)絡(luò)分層來看融蹂,它是屬于應(yīng)用層,TCP/IP 網(wǎng)絡(luò)分層總共有5層弄企,它是屬于最上層超燃,它的下一層則是 TCP/IP 傳輸層,如圖所示:

TCP通信過程

從邏輯平行來看桩蓉,發(fā)送方和接受方都是處于同一平行層淋纲,發(fā)送方每層傳遞的信息會(huì)在下一層進(jìn)行信息封裝加密,然后逐層傳遞院究,通過實(shí)際物理鏈路進(jìn)行傳遞洽瞬,然后接收方接收到信息進(jìn)行解密分析,不斷把報(bào)文頭信息進(jìn)行還原业汰,最后處理發(fā)送方發(fā)送過來的信息伙窃,處理完之后,再用同樣的方式傳遞回去样漆,兩者傳輸通信方式是全雙工模式为障。在此之前需要一個(gè)建立連接過程,所謂的三次握手,通信結(jié)束也有斷開連接過程鳍怨,也就是四次握手?jǐn)嚅_操作呻右。

在講述 HTTP 協(xié)議為何了解 TCP/IP 內(nèi)容呢,因?yàn)槲覀冃枰?HTTP 協(xié)議實(shí)際通信過程是怎么樣的鞋喇,它所依賴的環(huán)境是怎么樣的声滥,從切面角度去看,實(shí)際是經(jīng)歷了這5層通信侦香,從平面去看落塑,默認(rèn)以為是客戶端與服務(wù)端僅僅進(jìn)行平層通信而已,那是因?yàn)榉庋b的方便罐韩。

HTTP 1.1

因?yàn)槟壳爸髁髟谟玫倪€是以 HTTP 1.1 版本為主憾赁,那就用這個(gè)版本來分析。

HTTP請(qǐng)求協(xié)議詳解

一個(gè)典型HTTP1.1的請(qǐng)求協(xié)議報(bào)文結(jié)構(gòu)散吵,大體上可以分為三塊龙考,即請(qǐng)求行、頭部错蝴、消息主體洲愤。

HTTP請(qǐng)求報(bào)文協(xié)議

請(qǐng)求行

請(qǐng)求行包含HTTP請(qǐng)求方法颓芭、請(qǐng)求的URL顷锰、HTTP協(xié)議版本三個(gè)內(nèi)容,它們之間以空格間隔亡问,并以回車+換行結(jié)束官紫。HTTP請(qǐng)求方法有下面幾種,常用的有GET、POST請(qǐng)求州藕。

  • OPTIONS
  • GET
  • HEAD
  • POST
  • DELETE
  • TRACE
  • CONNECT

請(qǐng)求頭部

頭部可以分成三個(gè)部分束世,為常用頭域、請(qǐng)求頭域床玻、實(shí)體頭域毁涉。其中常用頭域和實(shí)體頭域部分內(nèi)容在響應(yīng)協(xié)議部分也有相同的定義。

常用頭域

常用頭域名稱 作用描述
Cache-Control 緩存控制
Connection HTTP 1.1默認(rèn)是支持長連接的(Keep-Alive)锈死,如果不希望支持長連接則需要在此域中寫入close
Date 表明消息產(chǎn)生的日期和時(shí)間
Pragma
Trailer
Transfer-Encoding 告知接收端為了保證報(bào)文的可靠傳輸贫堰,對(duì)報(bào)文采用了什么編碼方式
Upgrade 給出了發(fā)送端可能想要”升級(jí)”使用的新版本或協(xié)議
Via 顯示了報(bào)文經(jīng)過的中間節(jié)點(diǎn)(代理、網(wǎng)關(guān))
Warning

請(qǐng)求頭域

請(qǐng)求頭域名稱 作用描述
Accept 指明請(qǐng)求端可以接受處理的媒體類型
Accept-Charset 指明請(qǐng)求端可以接受的字符集
Accept-Encoding 指明請(qǐng)求端可以接受的編碼格式
Authorization 授權(quán)
Expect 允許客戶端列出某請(qǐng)求所要求的服務(wù)器行為
From 提供了客戶端用戶的E-mail地址
Host 指明請(qǐng)求端的網(wǎng)絡(luò)主機(jī)和端口號(hào)
If-Match 服務(wù)端在響應(yīng)頭部里面返回ETag信息待牵,客戶端請(qǐng)求時(shí)在頭部添加If-Match(值為響應(yīng)的ETag)其屏,服務(wù)端接收后判斷ETag是否相同,若相同則處理請(qǐng)求缨该,否則不處理請(qǐng)求偎行。
If-Modified-Since 客戶端在請(qǐng)求某一資源文件時(shí),在頭部加上If-Modified-Since(值為該資源文件的最后修改時(shí)間),服務(wù)端接收后將客戶端上報(bào)的修改時(shí)間與服務(wù)器存儲(chǔ)的文件的最后修改時(shí)間做對(duì)比蛤袒,如果相同熄云,說明資源文件沒有更新,返回304狀態(tài)碼妙真,告訴客戶端使用原來的緩存文件皱碘。否則返回資源內(nèi)容。
If-None-Match 服務(wù)端在響應(yīng)頭部里面返回ETag信息隐孽,客戶端請(qǐng)求時(shí)在頭部添加If-None-Match(值為響應(yīng)的ETag)癌椿,服務(wù)端接收后判斷ETag是否相同,若相同菱阵,說明資源沒有更新踢俄,返回304狀態(tài)碼,告訴客戶端使用原來的緩存文件晴及。否則返回資源內(nèi)容都办。
If-Range 該頭域與Range頭域一起使用,服務(wù)端在響應(yīng)頭部里面返回ETag信息,客戶端請(qǐng)求時(shí)在頭部添加If-Range(值為響應(yīng)的ETag)虑稼,服務(wù)端接收后判斷ETag是否相同琳钉,若相同,則返回狀態(tài)碼206蛛倦,返回內(nèi)容為Range指定的字節(jié)范圍歌懒。若不相同,則返回狀態(tài)碼200溯壶,返回內(nèi)容為整個(gè)實(shí)體及皂。
If-Unmodified-Since 客戶端在請(qǐng)求某一資源文件時(shí),在頭部加上If-Modified-Since(值為該資源文件的最后修改時(shí)間)且改,端接收后將客戶端上報(bào)的修改時(shí)間與服務(wù)器存儲(chǔ)的文件的最后修改時(shí)間做對(duì)比验烧,如果相同,則返回資源內(nèi)容又跛,如果不相同則返回狀態(tài)碼412碍拆。
Max-Forwards 配合TRACE、OPTIONS方法使用慨蓝,限制在通往服務(wù)器的路徑上的代理或網(wǎng)關(guān)的數(shù)量感混。
Proxy-Authorization 代理授權(quán)
Range 表示客戶端向服務(wù)端請(qǐng)求指定范圍的字節(jié)數(shù)量:Range:bytes=0-500表示請(qǐng)求第1個(gè)到第501個(gè)的字節(jié)數(shù)量。Range:bytes=100-表示請(qǐng)求第101到文件倒數(shù)第一個(gè)字節(jié)的字節(jié)數(shù)量菌仁。Range:bytes=-500表示請(qǐng)求最后500個(gè)字節(jié)的數(shù)量浩习。Range可以同時(shí)指定多組(Range:bytes=500-600,601-999)。并不是所有的服務(wù)端都支持字節(jié)范圍請(qǐng)求的济丘,如果支持字節(jié)范圍請(qǐng)求谱秽,服務(wù)端會(huì)返回狀態(tài)碼206洽蛀,若不支持則會(huì)返回200,客戶端需要根據(jù)狀態(tài)碼來判斷服務(wù)端是否支持字節(jié)范圍操作疟赊。此域可用于斷點(diǎn)下載郊供,即在斷點(diǎn)處請(qǐng)求后面的內(nèi)容,也可用于多線程下載同一個(gè)文件近哟,每個(gè)線程負(fù)責(zé)一個(gè)文件的一部分下載工作驮审,多個(gè)線程協(xié)同完成整個(gè)文件的下載。
Referer 用于指定客戶端請(qǐng)求的來源吉执,是從搜索引擎過來的疯淫?還是從其它網(wǎng)站鏈接過來的?服務(wù)器根據(jù)此域戳玫,有時(shí)可以用做防盜鏈處理熙掺,不在指定范圍內(nèi)的來源,統(tǒng)統(tǒng)拒絕咕宿。
TE 指明客戶端可以接受哪些傳輸編碼币绩。

實(shí)體頭域

實(shí)體頭域名稱 作用描述
Allow 指明被請(qǐng)求的資源所支持的方法,如GET府阀、HEAD缆镣、PUT
Content-Encoding 指明實(shí)體內(nèi)容所采用的編碼方式
Content-Language 指明實(shí)體內(nèi)容使用的語言
Content-Length 指明請(qǐng)求實(shí)體的字節(jié)數(shù)量
Content-Location 可以用來為實(shí)體提供對(duì)應(yīng)資源的位置
Content-MD5 指定實(shí)體內(nèi)容的MD5,用于內(nèi)容的完整性校驗(yàn)(base64的128位MD5)
Content-Range
Content-Type 指定實(shí)體的媒體類型
Expires 指明實(shí)體的過期時(shí)間
Last-Modified 指明實(shí)體最后被修改的時(shí)間

HTTP響應(yīng)協(xié)議詳解

HTTP1.1的響應(yīng)協(xié)議報(bào)文結(jié)構(gòu)试浙,大體上可以分為三塊董瞻,即狀態(tài)行、頭部川队、消息主體力细。

HTTP響應(yīng)報(bào)文協(xié)議

狀態(tài)行

狀態(tài)行包含HTTP協(xié)議版本、狀態(tài)碼固额、原因短語三個(gè)內(nèi)容,它們之間以空格間隔煞聪,并以回車+換行結(jié)束斗躏。

狀態(tài)碼由三位數(shù)字組成,第一位數(shù)字定義了響應(yīng)類型昔脯,主要有如下五種類型的狀態(tài)碼

狀態(tài)碼類型 作用描述
1xx 報(bào)告(請(qǐng)求被接收啄糙,繼續(xù)處理)
2xx 成功(請(qǐng)求被成功的接收并處理)
3xx 重發(fā)
4xx 客戶端出錯(cuò)(客戶端錯(cuò)誤的協(xié)議格式和不能處理的請(qǐng)求)
5xx 服務(wù)器出錯(cuò)(服務(wù)器無法完成有效的請(qǐng)求處理)

狀態(tài)碼和對(duì)應(yīng)的原因短語詳細(xì)描述

狀態(tài)碼 原因短語 中文描述
100 Continue 繼續(xù)
101 Switching Protocols 切換協(xié)議
200 OK 成功
201 Created 已創(chuàng)建
202 Accepted 接受
203 Non-Authoritative information 非權(quán)威信息
204 No Content 無內(nèi)容
205 Reset Content 重置內(nèi)容
206 Partial Content 部分內(nèi)容
300 Multiple Choices 多個(gè)選擇
301 Moved Permanently 永久移動(dòng)
302 Found 發(fā)現(xiàn)
303 See Other 見其它
304 Not Modified 沒有改變
305 Use Proxy 使用代理
307 Temporary Redirect 臨時(shí)重發(fā)
400 Bad Request 壞請(qǐng)求
401 Unauthorized 未授權(quán)的
402 Payment Required 必需的支付
403 Forbidden 禁用
404 Not Found 沒有找到
405 Method Not Allowed 方法不被允許
406 Not Acceptable 不可接受的
407 Proxy Authentication Required 需要代理驗(yàn)證
408 Request Timeout 請(qǐng)求超時(shí)
409 Confilict 沖突
410 Gone 不存在
411 Length Required 長度必需
412 Precondition Failed 先決條件失敗
413 Request Entity Too Large 請(qǐng)求實(shí)體太大
414 Request-URI Too Long 請(qǐng)求URI太長
415 Unsupported Media Type 不支持的媒體類型
416 Requested Range Not Satisfiable 請(qǐng)求范圍不被滿足
417 Expectation Failed 期望失敗
500 Internal Server Error 內(nèi)部服務(wù)器錯(cuò)誤
501 Not Implemented 服務(wù)端沒有實(shí)現(xiàn)
502 Bad Gateway 壞網(wǎng)關(guān)
503 Service Unavailable 服務(wù)不能獲得
504 Gateway Timeout 網(wǎng)關(guān)超時(shí)
505 HTTP Version Not Supported HTTP協(xié)議版本不支持

響應(yīng)頭域

響應(yīng)頭域名稱 作用描述
Accept-Ranges 服務(wù)器向客戶端指明服務(wù)器對(duì)范圍請(qǐng)求的接受度
Age 從原始服務(wù)器到代理緩存形成的估算時(shí)間(以秒計(jì),非負(fù))
ETag 實(shí)體標(biāo)簽
Location 指定重定向的URI
Proxy-Autenticate 它指出認(rèn)證方案和可應(yīng)用到代理的該URL上的參數(shù)
Retry-After 如果實(shí)體暫時(shí)不可取云稚,通知客戶端在指定時(shí)間之后再次嘗試
Server 指明服務(wù)器用于處理請(qǐng)求的軟件信息
Vary 告訴下游代理是使用緩存響應(yīng)還是從原始服務(wù)器請(qǐng)求
WWW-Authenticate 表明客戶端請(qǐng)求實(shí)體應(yīng)該使用的授權(quán)方案

交互流程

HTTP通信過程

整體通信其實(shí)就是發(fā)送/響應(yīng)過程隧饼,一個(gè)請(qǐng)求過去,對(duì)方有響應(yīng)內(nèi)容來返回静陈,請(qǐng)求發(fā)送和響應(yīng)回答方式燕雁,同時(shí) HTTP 1.1 的特點(diǎn)是無狀態(tài)的诞丽、快速響應(yīng)的,一次連接則馬上就斷開拐格。HTTP 2.0 則是相反僧免,完善了 HTTP 1.1 出現(xiàn)的問題,兩者連接是可復(fù)用的捏浊,同時(shí)可支持并行發(fā)送懂衩,一次多個(gè)文件傳遞,多個(gè)文件響應(yīng)金踪,支持傳遞的文件大小以二進(jìn)制方式浊洞,這樣確保可支持更大文件胡岔,在安全性上比 HTTP 1.1上更強(qiáng)大沛申,具體細(xì)節(jié)可查閱相關(guān)文檔。

URL 和 URI

這里有必要提下 URL 和 URI 這個(gè)兩個(gè)名詞的區(qū)別姐军。URL表示標(biāo)記了一個(gè)WWW互聯(lián)網(wǎng)資源(用地址標(biāo)記)铁材,并給出了他的訪問地址。而URI表示一個(gè)網(wǎng)絡(luò)資源奕锌,僅此而已著觉。

HTTPS

通信流程

HTTPS通信過程

具體步驟:

步驟 1:客戶端通過發(fā)送 Client Hello 報(bào)文開始 SSL 通信。 報(bào)文中包含客戶端支持的 SSL 的指定版本惊暴、 加密組件(Cipher Suite)列表(所使用的加密算法及密鑰長度等)饼丘。

步驟 2:服務(wù)器可進(jìn)行 SSL 通信時(shí), 會(huì)以 Server Hello 報(bào)文作為應(yīng)答辽话。 和客戶端一樣肄鸽, 在報(bào)文中包含 SSL 版本 以及加密組件。 服務(wù)器的加密組件內(nèi)容是從接收到的客戶端加密組件內(nèi)篩選出來的油啤。

步驟 3:之后服務(wù)器發(fā)送 Certificate 報(bào)文典徘。 報(bào)文中包含公開密鑰證書。

步驟 4:最后服務(wù)器發(fā)送 Server Hello Done 報(bào)文通知客戶端益咬, 最初階段的 SSL 握手協(xié)商部分結(jié)束逮诲。

步驟 5:SSL 第一次握手結(jié)束之后, 客戶端以 Client Key Exchange 報(bào)文作為回應(yīng)幽告。 報(bào)文中包含通信加密中使用 的一種被稱為 Pre- master secret 的隨機(jī)密碼串梅鹦。 該報(bào)文已用步驟 3 中的公開密鑰進(jìn)行加密。

步驟 6:接著客戶端繼續(xù)發(fā)送 Change Cipher Spec 報(bào)文冗锁。 該報(bào)文會(huì)提示服務(wù)器齐唆, 在此報(bào)文之后的通信會(huì)采用 Pre- master secret 密鑰加密。

步驟 7:客戶端發(fā)送 Finished 報(bào)文冻河。 該報(bào)文包含連接至今全部報(bào)文的整體校驗(yàn)值箍邮。 這次握手協(xié)商是否能夠成功茉帅, 要以服務(wù)器是否能夠正確解密該報(bào)文作為判定標(biāo)準(zhǔn)。

步驟 8:服務(wù)器同樣發(fā)送 Change Cipher Spec 報(bào)文媒殉。

步驟 9:服務(wù)器同樣發(fā)送 Finished 報(bào)文担敌。

步驟 10:服務(wù)器和客戶端的 Finished 報(bào)文交換完畢之后, SSL 連接就算建立完成廷蓉。 當(dāng)然全封, 通信會(huì)受到 SSL 的保護(hù)。 從此處開始進(jìn)行應(yīng)用層協(xié)議的通信桃犬, 即發(fā)送 HTTP 請(qǐng)求刹悴。

步驟 11: 應(yīng)用層協(xié)議通信, 即發(fā)送 HTTP 響應(yīng)攒暇。

步驟 12: 最后 由 客戶 端斷開連接土匀。 斷開連接時(shí), 發(fā)送 close_ notify 報(bào)文形用。 上圖做了一些省略就轧, 這步之后再 發(fā)送 TCP FIN 報(bào)文來關(guān)閉與 TCP 的通信。

加密算法

常見的加密算法可以分成三類田度,對(duì)稱加密算法妒御,非對(duì)稱加密算法和Hash算法。

對(duì)稱加密

指加密和解密使用相同密鑰的加密算法镇饺。對(duì)稱加密算法的優(yōu)點(diǎn)在于加解密的高速度和使用長密鑰時(shí)的難破解性乎莉。假設(shè)兩個(gè)用戶需要使用對(duì)稱加密方法加密然后交換數(shù)據(jù),則用戶最少需要2個(gè)密鑰并交換使用奸笤,如果企業(yè)內(nèi)用戶有n個(gè)惋啃,則整個(gè)企業(yè)共需要n×(n-1) 個(gè)密鑰,密鑰的生成和分發(fā)將成為企業(yè)信息部門的惡夢(mèng)监右。對(duì)稱加密算法的安全性取決于加密密鑰的保存情況边灭,但要求企業(yè)中每一個(gè)持有密鑰的人都保守秘密是不可能的,他們通常會(huì)有意無意的把密鑰泄漏出去——如果一個(gè)用戶使用的密鑰被入侵者所獲得秸侣,入侵者便可以讀取該用戶密鑰加密的所有文檔存筏,如果整個(gè)企業(yè)共用一個(gè)加密密鑰,那整個(gè)企業(yè)文檔的保密性便無從談起味榛。

常見的對(duì)稱加密算法:DES、3DES予跌、DESX搏色、Blowfish、IDEA券册、RC4频轿、RC5垂涯、RC6和AES

非對(duì)稱加密

指加密和解密使用不同密鑰的加密算法,也稱為公私鑰加密航邢。假設(shè)兩個(gè)用戶要加密交換數(shù)據(jù)耕赘,雙方交換公鑰,使用時(shí)一方用對(duì)方的公鑰加密膳殷,另一方即可用自己的私鑰解密操骡。如果企業(yè)中有n個(gè)用戶,企業(yè)需要生成n對(duì)密鑰赚窃,并分發(fā)n個(gè)公鑰册招。由于公鑰是可以公開的,用戶只要保管好自己的私鑰即可勒极,因此加密密鑰的分發(fā)將變得十分簡單是掰。同時(shí),由于每個(gè)用戶的私鑰是唯一的辱匿,其他用戶除了可以可以通過信息發(fā)送者的公鑰來驗(yàn)證信息的來源是否真實(shí)键痛,還可以確保發(fā)送者無法否認(rèn)曾發(fā)送過該信息。非對(duì)稱加密的缺點(diǎn)是加解密速度要遠(yuǎn)遠(yuǎn)慢于對(duì)稱加密匾七,在某些極端情況下絮短,甚至能比非對(duì)稱加密慢上1000倍。

常見的非對(duì)稱加密算法:RSA乐尊、ECC(移動(dòng)設(shè)備用)戚丸、Diffie-Hellman、El Gamal扔嵌、DSA(數(shù)字簽名用)

Hash算法

Hash算法特別的地方在于它是一種單向算法限府,用戶可以通過Hash算法對(duì)目標(biāo)信息生成一段特定長度的唯一的Hash值,卻不能通過這個(gè)Hash值重新獲得目標(biāo)信息痢缎。因此Hash算法常用在不可還原的密碼存儲(chǔ)胁勺、信息完整性校驗(yàn)等。

常見的Hash算法:MD2独旷、MD4署穗、MD5、HAVAL嵌洼、SHA案疲、SHA-1、HMAC麻养、HMAC-MD5褐啡、HMAC-SHA1

數(shù)字證書和數(shù)字簽名證書

數(shù)字證書是由權(quán)威的CA機(jī)構(gòu)頒發(fā)的無法被偽造的證書,用于校驗(yàn)發(fā)送方實(shí)體身份的認(rèn)證鳖昌。解決如上問題备畦,只需要發(fā)送方A找一家權(quán)威的CA機(jī)構(gòu)申請(qǐng)頒發(fā)數(shù)字證書低飒,證書內(nèi)包含A的相關(guān)資料信息以及A的公鑰,然后將正文A懂盐、數(shù)字證書以及A生成的數(shù)字簽名發(fā)送給B褥赊,此時(shí)中間人M是無法篡改正文內(nèi)容而轉(zhuǎn)發(fā)給B的,因?yàn)镸不可能擁有這家CA的私鑰莉恼,無法隨機(jī)制作數(shù)字證書拌喉。當(dāng)然,如果M也申請(qǐng)了同一家CA的數(shù)字證書并替換發(fā)送修改后的正文类垫、M的數(shù)字證書和M的數(shù)字簽名司光,此時(shí)B接收到數(shù)據(jù)時(shí),會(huì)校驗(yàn)數(shù)字證書M中的信息與當(dāng)前通信方是否一致悉患,發(fā)現(xiàn)數(shù)字證書中的個(gè)人信息為M并非A残家,說明證書存在替換風(fēng)險(xiǎn),可以選擇中斷通信售躁。

為什么CA制作的證書是無法被偽造的坞淮?其實(shí)CA制作的數(shù)字證書內(nèi)還包含CA對(duì)證書的數(shù)字簽名,接收方可以使用CA公開的公鑰解密數(shù)字簽名陪捷,并使用相同的摘要算法驗(yàn)證當(dāng)前數(shù)字證書是否合法回窘。制作證書需要使用對(duì)應(yīng)CA機(jī)構(gòu)的私鑰,因此CA頒發(fā)的證書是無法被非法偽造的(CA的私鑰泄露不在考慮討論與考慮范圍內(nèi))市袖。

數(shù)字證書簽名的基礎(chǔ)就是非對(duì)稱加密算法和數(shù)字簽名啡直,其無法偽造的特性使得其應(yīng)用面較廣,HTTPS中就使用了數(shù)字證書來保證握手階段服務(wù)端傳輸?shù)墓€的可靠性苍碟。

數(shù)字簽名是非對(duì)稱加密算法和摘要算法的一種應(yīng)用酒觅,能夠保證信息在傳輸過程中不被篡改,也能保證數(shù)據(jù)不能被偽造微峰。使用時(shí)舷丹,發(fā)送方使用摘要算法獲得發(fā)布內(nèi)容的摘要,然后使用私鑰對(duì)摘要進(jìn)行加密(加密后的數(shù)據(jù)就是數(shù)字簽名)蜓肆,然后將發(fā)布內(nèi)容颜凯、數(shù)字簽名和公鑰一起發(fā)送給接收方即可。接收方接收到內(nèi)容后仗扬,首選取出公鑰解密數(shù)字簽名症概,獲得正文的摘要數(shù)據(jù),然后使用相同的摘要算法計(jì)算摘要數(shù)據(jù)早芭,將計(jì)算的摘要與解密的摘要進(jìn)行比較穴豫,若一致,則說明發(fā)布內(nèi)容沒有被篡改逼友。

身份認(rèn)證

計(jì)算機(jī)本身無法判斷坐在顯示器前的使用者的身份精肃。 進(jìn)一步說, 也無法確認(rèn)網(wǎng)絡(luò)的那頭究竟有誰帜乞。 可見司抱,為了 弄清究竟是誰在訪問服務(wù)器, 就得讓對(duì)方的客戶端自報(bào)家門黎烈。 比如习柠,就算正在訪問服務(wù)器的對(duì)方聲稱自己是 小明, 身份是否屬實(shí)這點(diǎn)卻也無從談起照棋。 為確認(rèn)小明本人是否真的具有訪問系統(tǒng)的權(quán)限资溃, 就需要核對(duì)“ 登錄者 本人才知道的信息”、“ 登錄者本人才會(huì)有的信息”烈炭。所以才需要以下幾種驗(yàn)證溶锭。

  • Basic認(rèn)證:Basic 認(rèn)證是HTTP中非常簡單的認(rèn)證方式,因?yàn)楹唵畏叮圆皇呛馨踩贿^仍然非常常用霹疫。當(dāng)一個(gè)客戶端向一個(gè)需要認(rèn)證的HTTP服務(wù)器進(jìn)行數(shù)據(jù)請(qǐng)求時(shí)拱绑,如果之前沒有認(rèn)證過,HTTP服務(wù)器會(huì)返回401狀態(tài)碼丽蝎,要求客戶端輸入用戶名和密碼猎拨。用戶輸入用戶名和密碼后,用戶名和密碼會(huì)經(jīng)過BASE64加密附加到請(qǐng)求信息中再次請(qǐng)求HTTP服務(wù)器屠阻,HTTP服務(wù)器會(huì)根據(jù)請(qǐng)求頭攜帶的認(rèn)證信息红省,決定是否認(rèn)證成功及做出相應(yīng)的響應(yīng)。
  • Digest認(rèn)證:Digest 認(rèn)證試圖解決 Basic 認(rèn)證的諸多缺陷而設(shè)計(jì)栏笆,用戶密碼在整個(gè)認(rèn)證過程中是個(gè)關(guān)鍵性要素类腮。
  • SSL客戶端認(rèn)證:從使用用戶 ID 和密碼的認(rèn)證方式方面來講, 只要二者的內(nèi)容正確蛉加, 即可認(rèn)證是本人的 行為蚜枢。 但如果用戶 ID 和密碼被盜, 就很有可能被第三者冒充针饥。 利用 SSL 客戶端認(rèn)證則可以避免 該情況的發(fā)生厂抽。 SSL 客戶端認(rèn)證是借由 HTTPS 的客戶端證書完成認(rèn)證的方式。 憑借客戶端證書認(rèn)證丁眼, 服務(wù)器可確認(rèn)訪問是否來自已登錄的客戶 端筷凤。

Web攻防技術(shù)

常見的web攻擊技術(shù)有哪些呢,如下:

1,XSS 跨站攻擊技術(shù):主要是攻擊者往網(wǎng)頁里嵌入惡意腳本藐守,或者通過改變 HTML 元素屬性來實(shí)現(xiàn)攻擊挪丢,主要原因在于開發(fā)者對(duì)用戶的變量直接使用導(dǎo)致進(jìn)入 HTML 中會(huì)被直接編譯成 JS,通常的 GET 請(qǐng)求通過 URL 來傳參卢厂,可以在 URL 中傳入惡意腳本乾蓬,從而獲取信息,解決方法:特殊字符過濾慎恒。

2任内,SQL 注入攻擊:主要是就是通過把 SQL 命令插入到 Web 表單提交或輸入域名或頁面請(qǐng)求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的 SQL 命令融柬,比如 select * from test where username="wuxu" or 1=1死嗦,這樣會(huì)使用戶跳過密碼直接登錄,具體解決方案:

  • 特殊字符過濾粒氧,不要用拼接字符串的方法來湊sql語句越除。
  • 對(duì) sql 語句進(jìn)行預(yù)編譯,比如 java 的 preparedstatement靠欢。
  • 關(guān)閉錯(cuò)誤信息廊敌,攻擊者可能會(huì)通過不斷的嘗試來得到數(shù)據(jù)庫的一些信息,所以關(guān)閉錯(cuò)誤信息變得重要起來门怪。
  • 客戶端對(duì)數(shù)據(jù)進(jìn)行加密骡澈,使原來傳進(jìn)來的參數(shù)因?yàn)榧用芏贿^濾掉。
  • 控制數(shù)據(jù)庫的權(quán)限掷空,比如只能 select肋殴,不能 insert,防止攻擊者通過 select * from test 坦弟;drop tables這種操作护锤。

3,OS 命令注入攻擊:系統(tǒng)提供命令執(zhí)行類函數(shù)主要方便處理相關(guān)應(yīng)用場(chǎng)景的功能.而當(dāng)不合理的使用這類函數(shù)酿傍,同時(shí)調(diào)用的變量未考慮安全因素烙懦,就會(huì)執(zhí)行惡意的命令調(diào)用,被攻擊利用赤炒。主要原因是服務(wù)端在調(diào)用系統(tǒng)命令時(shí)采用的是字符串連接的方式氯析,比如 a="a.txt;rm -rf *",system("rm -rf {$a}"),這會(huì)給服務(wù)端帶去慘痛的代價(jià)莺褒,具體解決方案:

  • 在程序開發(fā)時(shí)少用系統(tǒng)命令掩缓,執(zhí)行命令的參數(shù)盡量不要從外部獲取。
  • 參數(shù)特殊字符過濾

4遵岩,HTTP 首部注入攻擊

5你辣,郵件首部注入攻擊:它允許惡意攻擊者注入任何郵件頭字段,BCC、CC、主題等,它允許黑客通過注入手段從受害者的郵件服務(wù)器發(fā)送垃圾郵件舍哄。主要是利用郵件系統(tǒng)傳參的bug來進(jìn)行攻擊宴凉,解決方法:1、使用正則表達(dá)式來過濾用用戶提交的數(shù)據(jù)蠢熄。例如,我們可以在輸入字符串中搜索(r 或 n)跪解。2、永遠(yuǎn)不要信任用戶的輸入签孔。3、使用外部組建和庫

6窘行,目錄遍歷攻擊:目錄遍歷是Http所存在的一個(gè)安全漏洞饥追,它使得攻擊者能夠訪問受限制的目錄,并在Web服務(wù)器的根目錄以外執(zhí)行命令罐盔。

7但绕,遠(yuǎn)程目錄包含攻擊,原理就是注入一段用戶能控制的腳本或代碼惶看,并讓服務(wù)端執(zhí)行捏顺。比如 php 中的include($filename),而此 filename 由用戶傳入纬黎,用戶即可傳入一段惡意腳本幅骄,從而對(duì)服務(wù)其造成傷害,解決方法:當(dāng)采用文件包含函數(shù)的時(shí)候本今,不應(yīng)動(dòng)態(tài)傳入拆座,而應(yīng)該有具體的文件名,如果動(dòng)態(tài)傳入冠息,要保證動(dòng)態(tài)變量不被用戶所控制

8挪凑,會(huì)話劫持:這是一種通過獲取用戶Session ID后,使用該 Session ID 登錄目標(biāo)賬號(hào)的攻擊方法逛艰,此時(shí)攻擊者實(shí)際上是使用了目標(biāo)賬戶的有效 Session躏碳。會(huì)話劫持的第一步是取得一個(gè)合法的會(huì)話標(biāo)識(shí)來偽裝成合法用戶,因此需要保證會(huì)話標(biāo)識(shí)不被泄漏散怖,通俗一點(diǎn)就是用戶在登錄時(shí)菇绵,唯一標(biāo)示用戶身份的 session id被劫持,使得攻擊者可以用這個(gè) session id 來進(jìn)行登錄后操作杭抠,而攻擊者主要是通過 竊攘掣省:使用網(wǎng)絡(luò)嗅探,XSS 攻擊等方法獲得偏灿。而第一種方式網(wǎng)絡(luò)嗅探丹诀,我們可以通過 ssl 加密,也就是 https 來對(duì)報(bào)文進(jìn)行加密,從而防止報(bào)文被截獲铆遭,而第二種方式xss 攻擊硝桩,方式在第一種已經(jīng)給出,不再贅述枚荣。此外通過設(shè)置 HttpOnly碗脊。通過設(shè)置 Cookie 的 HttpOnly 為 true,可以防止客戶端腳本訪問這個(gè) Cookie橄妆,從而有效的防止 XSS 攻擊衙伶,還有就是設(shè)置 token 驗(yàn)證。關(guān)閉透明化Session ID害碾。透明化 Session ID 指當(dāng)瀏覽器中的 Http 請(qǐng)求沒有使用 Cookie 來存放 Session ID 時(shí)矢劲,Session ID 則使用URL來傳遞。

9慌随,會(huì)話固定:會(huì)話固定是會(huì)話劫持的一種芬沉,區(qū)別就是,會(huì)話固定是攻擊者通過某種手段重置目標(biāo)用戶的SessionID阁猜,然后監(jiān)聽用戶會(huì)話狀態(tài)丸逸;用戶攜帶sessionid進(jìn)行登錄,攻擊者獲取sessionid來進(jìn)行會(huì)話剃袍,解決方案:服務(wù)端設(shè)置用戶登錄后的sessionid與登錄前不一樣即可黄刚,另外會(huì)話劫持的方法也可以用在會(huì)話固定上

10,csrf跨站偽造請(qǐng)求攻擊:其實(shí)就是攻擊者盜用了你的身份笛园,以你的名義發(fā)送惡意請(qǐng)求隘击。

總的來說,通過輸出這么一篇文章研铆,自己的對(duì) HTTP 協(xié)議有了進(jìn)一步的認(rèn)知埋同,同時(shí)也通過寫作整理過程讓自己對(duì)某一個(gè)知識(shí)點(diǎn)有很好的聯(lián)想和串聯(lián),積累從點(diǎn)開始棵红,然后形成面凶赁,最后就會(huì)有一個(gè)知識(shí)樹生長起來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逆甜,一起剝皮案震驚了整個(gè)濱河市虱肄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌交煞,老刑警劉巖咏窿,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異素征,居然都是意外死亡集嵌,警方通過查閱死者的電腦和手機(jī)萝挤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來根欧,“玉大人怜珍,你說我怎么就攤上這事》锎郑” “怎么了酥泛?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫌拣。 經(jīng)常有香客問我柔袁,道長,這世上最難降的妖魔是什么亭罪? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任瘦馍,我火速辦了婚禮,結(jié)果婚禮上应役,老公的妹妹穿的比我還像新娘。我一直安慰自己燥筷,他們只是感情好箩祥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肆氓,像睡著了一般袍祖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谢揪,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天蕉陋,我揣著相機(jī)與錄音,去河邊找鬼拨扶。 笑死凳鬓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的患民。 我是一名探鬼主播缩举,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼匹颤!你這毒婦竟也來了仅孩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤印蓖,失蹤者是張志新(化名)和其女友劉穎辽慕,沒想到半個(gè)月后吐辙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掏膏,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缰盏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屁商。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹅很,死狀恐怖像吻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勺爱,我是刑警寧澤晃琳,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站琐鲁,受9級(jí)特大地震影響卫旱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜围段,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一顾翼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奈泪,春花似錦适贸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冯遂,卻和暖如春蕊肥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛤肌。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工壁却, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裸准。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓展东,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狼速。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琅锻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容