Http與Https的區(qū)別
Http是明文傳輸?shù)?,Https協(xié)議是在Http協(xié)議上添加了SSL的加密協(xié)議,可以進(jìn)行加密傳輸和身份驗(yàn)證。
其實(shí)就是說Http對(duì)網(wǎng)絡(luò)傳輸完全是裸奔狀態(tài),也就沒辦法防范中間人攻擊,因?yàn)楦緵]有加解密措施。不過Https相比Http也只是添加了SSL加密層,所以它仍然是一種特殊的Http,仍然是無狀態(tài)的。
Https的鏈接建立過程
- 根據(jù)訪問的URL,Web服務(wù)器會(huì)判斷你是否需要建立Https加密鏈接
- Web服務(wù)器接受到請(qǐng)求之后會(huì)將網(wǎng)站的證書,公鑰一起傳輸給請(qǐng)求者
- 請(qǐng)求者與Web服務(wù)器溝通協(xié)商加密等級(jí),也就是安全等級(jí)
- 根據(jù)協(xié)商后的加密等級(jí),請(qǐng)求者使用之前Web服務(wù)器傳遞來的網(wǎng)站公鑰加密私鑰,然后傳遞給Web服務(wù)器
- Web服務(wù)器利用自己的私鑰解密傳輸來的信息
- 建立通訊
TCP鏈接的建立過程
常見的Http狀態(tài)碼
一些常見的狀態(tài)碼為:
200 - 服務(wù)器成功返回網(wǎng)頁(yè)
404 - 請(qǐng)求的網(wǎng)頁(yè)不存在
503 - 服務(wù)不可用
詳細(xì)分解:
1xx(臨時(shí)響應(yīng))
表示臨時(shí)響應(yīng)并需要請(qǐng)求者繼續(xù)執(zhí)行操作的狀態(tài)代碼。
代碼 說明
100 (繼續(xù)) 請(qǐng)求者應(yīng)當(dāng)繼續(xù)提出請(qǐng)求。服務(wù)器返回此代碼表示已收到請(qǐng)求的第一部分,正在等待其余部分。
101 (切換協(xié)議) 請(qǐng)求者已要求服務(wù)器切換協(xié)議,服務(wù)器已確認(rèn)并準(zhǔn)備切換。
2xx (成功)
表示成功處理了請(qǐng)求的狀態(tài)代碼。
代碼 說明
200 (成功) 服務(wù)器已成功處理了請(qǐng)求。通常,這表示服務(wù)器提供了請(qǐng)求的網(wǎng)頁(yè)。
201 (已創(chuàng)建) 請(qǐng)求成功并且服務(wù)器創(chuàng)建了新的資源。
202 (已接受) 服務(wù)器已接受請(qǐng)求,但尚未處理。
203 (非授權(quán)信息) 服務(wù)器已成功處理了請(qǐng)求,但返回的信息可能來自另一來源。
204 (無內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒有返回任何內(nèi)容。
205 (重置內(nèi)容) 服務(wù)器成功處理了請(qǐng)求,但沒有返回任何內(nèi)容。
206 (部分內(nèi)容) 服務(wù)器成功處理了部分 GET 請(qǐng)求。
3xx (重定向)
表示要完成請(qǐng)求,需要進(jìn)一步操作。 通常,這些狀態(tài)代碼用來重定向。
代碼 說明
300 (多種選擇) 針對(duì)請(qǐng)求,服務(wù)器可執(zhí)行多種操作。服務(wù)器可根據(jù)請(qǐng)求者 (user agent) 選擇一項(xiàng)操作,或提供操作列表供請(qǐng)求者選擇。
301 (永久移動(dòng)) 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。服務(wù)器返回此響應(yīng)(對(duì) GET 或 HEAD 請(qǐng)求的響應(yīng))時(shí),會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。
302 (臨時(shí)移動(dòng)) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求。
303 (查看其他位置) 請(qǐng)求者應(yīng)當(dāng)對(duì)不同的位置使用單獨(dú)的 GET 請(qǐng)求來檢索響應(yīng)時(shí),服務(wù)器返回此代碼。
304 (未修改) 自從上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁(yè)未修改過。服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁(yè)內(nèi)容。
305 (使用代理) 請(qǐng)求者只能使用代理訪問請(qǐng)求的網(wǎng)頁(yè)。如果服務(wù)器返回此響應(yīng),還表示請(qǐng)求者應(yīng)使用代理。
307 (臨時(shí)重定向) 服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求。
4xx(請(qǐng)求錯(cuò)誤)
這些狀態(tài)代碼表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。
代碼 說明
400 (錯(cuò)誤請(qǐng)求) 服務(wù)器不理解請(qǐng)求的語法。
401 (未授權(quán)) 請(qǐng)求要求身份驗(yàn)證。 對(duì)于需要登錄的網(wǎng)頁(yè),服務(wù)器可能返回此響應(yīng)。
403 (禁止) 服務(wù)器拒絕請(qǐng)求。
404 (未找到) 服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)。
405 (方法禁用) 禁用請(qǐng)求中指定的方法。
406 (不接受) 無法使用請(qǐng)求的內(nèi)容特性響應(yīng)請(qǐng)求的網(wǎng)頁(yè)。
407 (需要代理授權(quán)) 此狀態(tài)代碼與 401(未授權(quán))類似,但指定請(qǐng)求者應(yīng)當(dāng)授權(quán)使用代理。
408 (請(qǐng)求超時(shí)) 服務(wù)器等候請(qǐng)求時(shí)發(fā)生超時(shí)。
409 (沖突) 服務(wù)器在完成請(qǐng)求時(shí)發(fā)生沖突。服務(wù)器必須在響應(yīng)中包含有關(guān)沖突的信息。
410 (已刪除) 如果請(qǐng)求的資源已永久刪除,服務(wù)器就會(huì)返回此響應(yīng)。
411 (需要有效長(zhǎng)度) 服務(wù)器不接受不含有效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求。
412 (未滿足前提條件) 服務(wù)器未滿足請(qǐng)求者在請(qǐng)求中設(shè)置的其中一個(gè)前提條件。
413 (請(qǐng)求實(shí)體過大) 服務(wù)器無法處理請(qǐng)求,因?yàn)檎?qǐng)求實(shí)體過大,超出服務(wù)器的處理能力。
414 (請(qǐng)求的 URI 過長(zhǎng)) 請(qǐng)求的 URI(通常為網(wǎng)址)過長(zhǎng),服務(wù)器無法處理。
415 (不支持的媒體類型) 請(qǐng)求的格式不受請(qǐng)求頁(yè)面的支持。
416 (請(qǐng)求范圍不符合要求) 如果頁(yè)面無法提供請(qǐng)求的范圍,則服務(wù)器會(huì)返回此狀態(tài)代碼。
417 (未滿足期望值) 服務(wù)器未滿足”期望”請(qǐng)求標(biāo)頭字段的要求。
5xx(服務(wù)器錯(cuò)誤)
這些狀態(tài)代碼表示服務(wù)器在嘗試處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。 這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤,而不是請(qǐng)求出錯(cuò)。
代碼 說明
500 (服務(wù)器內(nèi)部錯(cuò)誤) 服務(wù)器遇到錯(cuò)誤,無法完成請(qǐng)求。
501 (尚未實(shí)施) 服務(wù)器不具備完成請(qǐng)求的功能。例如,服務(wù)器無法識(shí)別請(qǐng)求方法時(shí)可能會(huì)返回此代碼。
502 (錯(cuò)誤網(wǎng)關(guān)) 服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無效響應(yīng)。
503 (服務(wù)不可用) 服務(wù)器目前無法使用(由于超載或停機(jī)維護(hù))。通常,這只是暫時(shí)狀態(tài)。
504 (網(wǎng)關(guān)超時(shí)) 服務(wù)器作為網(wǎng)關(guān)或代理,但是沒有及時(shí)從上游服務(wù)器收到請(qǐng)求。
505 (HTTP 版本不受支持) 服務(wù)器不支持請(qǐng)求中所用的 HTTP 協(xié)議版本。
HttpWatch狀態(tài)碼Result is
200 - 服務(wù)器成功返回網(wǎng)頁(yè),客戶端請(qǐng)求已成功。
302 - 對(duì)象臨時(shí)移動(dòng)。服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求。
304 - 屬于重定向。自上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁(yè)未修改過。服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁(yè)內(nèi)容。
401 - 未授權(quán)。請(qǐng)求要求身份驗(yàn)證。 對(duì)于需要登錄的網(wǎng)頁(yè),服務(wù)器可能返回此響應(yīng)。
404 - 未找到。服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)。
2xx - 成功。表示服務(wù)器成功地接受了客戶端請(qǐng)求。
3xx - 重定向。表示要完成請(qǐng)求,需要進(jìn)一步操作??蛻舳藶g覽器必須采取更多操作來實(shí)現(xiàn)請(qǐng)求。例如,瀏覽器可能不得不請(qǐng)求服務(wù)器上的不同的頁(yè)面,或通過代理服務(wù)器重復(fù)該請(qǐng)求。
4xx - 請(qǐng)求錯(cuò)誤。這些狀態(tài)代碼表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。
5xx - 服務(wù)器錯(cuò)誤。表示服務(wù)器在嘗試處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。 這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤,而不是請(qǐng)求出錯(cuò)。
Cookie、SessionStorage、LocalStorage
共同點(diǎn):都是保存在瀏覽器端,并且是同源的
Cookie
cookie數(shù)據(jù)始終在同源的http請(qǐng)求中攜帶(即使不需要),即cookie在瀏覽器和服務(wù)器間來回傳遞。而sessionStorage和localStorage不會(huì)自動(dòng)把數(shù)據(jù)發(fā)給服務(wù)器,僅在本地保存。cookie數(shù)據(jù)還有路徑(path)的概念,可以限制cookie只屬于某個(gè)路徑下,存儲(chǔ)的大小很小只有4K左右。Cookie的有效期由預(yù)先指定的過期時(shí)間決定。 (key:可以在瀏覽器和服務(wù)器端來回傳遞,存儲(chǔ)容量小,只有大約4K左右)
在同源請(qǐng)求中始終存在,且存儲(chǔ)量較小,僅在客戶端本地保存
sessionStorage
僅在當(dāng)前瀏覽器窗口關(guān)閉前有效,自然也就不可能持久保持,localStorage:始終有效,窗口或?yàn)g覽器關(guān)閉也一直保存,因此用作持久數(shù)據(jù);cookie只在設(shè)置的cookie過期時(shí)間之前一直有效,即使窗口或?yàn)g覽器關(guān)閉。(key:本身就是一個(gè)會(huì)話過程,關(guān)閉瀏覽器后消失,session為一個(gè)會(huì)話,當(dāng)頁(yè)面不同即使是同一頁(yè)面打開兩次,也被視為同一次回話)
同一個(gè)會(huì)話指的是當(dāng)前瀏覽器頁(yè)面
localStorage
localStorage 在所有同源窗口中都是共享的,且LocalStorage是永久保存的,除非手動(dòng)清除數(shù)據(jù);cookie也是在所有同源窗口中都是共享的。(key:同源窗口都會(huì)共享,并且不會(huì)失效,不管窗口或者瀏覽器關(guān)閉與否都會(huì)始終生效)
補(bǔ)充說明一下cookie的作用:
保存用戶登錄狀態(tài)。例如將用戶id存儲(chǔ)于一個(gè)cookie內(nèi),這樣當(dāng)用戶下次訪問該頁(yè)面時(shí)就不需要重新登錄了,現(xiàn)在很多論壇和社區(qū)都提供這樣的功能。 cookie還可以設(shè)置過期時(shí)間,當(dāng)超過時(shí)間期限后,cookie就會(huì)自動(dòng)消失。因此,系統(tǒng)往往可以提示用戶保持登錄狀態(tài)的時(shí)間:常見選項(xiàng)有一個(gè)月、三個(gè) 月、一年等。
Cookie與Session的聯(lián)系
Cookie是存在瀏覽器本地的,由于Http協(xié)議是無狀態(tài)的,所以Cookie的主要作用之一就是存儲(chǔ)SessionID,而Session是Web服務(wù)器用來保存與某一指定客戶端的會(huì)話信息,使用SessionID來進(jìn)行標(biāo)識(shí)。
CSRF與XSS攻擊
CSRF
跨站請(qǐng)求偽造 Cross-site request forgery,可以理解為攻擊者盜用了用戶的身份,以用戶的名義發(fā)送了惡意請(qǐng)求。比如用戶登錄了一個(gè)網(wǎng)站后,立刻在另一個(gè)tab頁(yè)面訪問攻擊者用來制造攻擊的網(wǎng)站,這個(gè)網(wǎng)站要求訪問剛剛登錄的網(wǎng)站,并發(fā)送了一個(gè)惡意請(qǐng)求,這時(shí)候CSRF就產(chǎn)生了,比如這個(gè)制造攻擊的網(wǎng)站使用一張圖片,但是這種圖片的鏈接卻是可以修改數(shù)據(jù)庫(kù)的,這時(shí)候攻擊者就可以以用戶的名義操作這個(gè)數(shù)據(jù)庫(kù),防御方式的話:使用驗(yàn)證碼,檢查https頭部的refer,使用token
一個(gè)簡(jiǎn)單的例子
假如一家銀行用以運(yùn)行轉(zhuǎn)賬操作的URL地址如下: https://bank./withdraw?account=AccoutName&amount=1000&for=PayeeName
那么,一個(gè)惡意攻擊者可以在另一個(gè)網(wǎng)站上放置如下代碼: <img src="https://bank./withdraw?account=Alice&amount=1000&for=Badman" />
如果有賬戶名為Alice的用戶訪問了惡意站點(diǎn),而她之前剛訪問過銀行不久,登錄信息尚未過期,那么她就會(huì)損失1000資金。
這種惡意的網(wǎng)址可以有很多種形式,藏身于網(wǎng)頁(yè)中的許多地方。此外,攻擊者也不需要控制放置惡意網(wǎng)址的網(wǎng)站。例如他可以將這種地址藏在論壇,博客等任何用戶生成內(nèi)容的網(wǎng)站中。這意味著如果服務(wù)端沒有合適的防御措施的話,用戶即使訪問熟悉的可信網(wǎng)站也有受攻擊的危險(xiǎn)。
透過例子能夠看出,攻擊者并不能通過CSRF攻擊來直接獲取用戶的賬戶控制權(quán),也不能直接竊取用戶的任何信息。他們能做到的,是欺騙用戶的瀏覽器,讓其以用戶的名義運(yùn)行操作。
XSS
跨站腳本攻擊,是說攻擊者通過注入惡意的腳本,在用戶瀏覽網(wǎng)頁(yè)的時(shí)候進(jìn)行攻擊,比如獲取cookie,或者其他用戶身份信息,可以分為存儲(chǔ)型和反射型,存儲(chǔ)型是攻擊者輸入一些數(shù)據(jù)并且存儲(chǔ)到了數(shù)據(jù)庫(kù)中,其他瀏覽者看到的時(shí)候進(jìn)行攻擊,反射型的話不存儲(chǔ)在數(shù)據(jù)庫(kù)中,往往表現(xiàn)為將攻擊代碼放在url地址的請(qǐng)求參數(shù)中,防御的話為cookie設(shè)置httpOnly屬性,對(duì)用戶的輸入進(jìn)行檢查,進(jìn)行特殊字符過濾.
當(dāng)網(wǎng)景(Netscape)最初推出JavaScript語言時(shí),他們也察覺到準(zhǔn)許網(wǎng)頁(yè)服務(wù)器發(fā)送可執(zhí)行的代碼給一個(gè)瀏覽器的安全風(fēng)險(xiǎn)(即使僅是在一個(gè)瀏覽器的沙盒里)。它所造成的一個(gè)關(guān)鍵的問題在于用戶同時(shí)開啟多個(gè)瀏覽器視窗時(shí),在某些例子里,網(wǎng)頁(yè)里的片斷代碼被允許從另一個(gè)網(wǎng)頁(yè)或對(duì)象取出資料,而因?yàn)閻阂獾?a href="https://zh./wiki/%E7%B6%B2%E7%AB%99" target="_blank">網(wǎng)站可以用這個(gè)方法來嘗試竊取機(jī)密信息,所以在某些情形,這應(yīng)是完全被禁止的。為了解決這個(gè)問題,瀏覽器采用了同源決策——僅允許來自相同域名系統(tǒng)和使用相同協(xié)議的對(duì)象與網(wǎng)頁(yè)之間的任何交互。這樣一來,惡意的網(wǎng)站便無法借由JavaScript在另一個(gè)瀏覽器竊取機(jī)密資料。此后,為了保護(hù)用戶免受惡意的危害,其他的瀏覽器與服務(wù)端指令語言采用了類似的訪問控制決策。
XSS漏洞可以追溯到1990年代。大量的網(wǎng)站曾遭受XSS漏洞攻擊或被發(fā)現(xiàn)此類漏洞,如Twitter[1],Facebook[2],MySpace,Orkut ,新浪微博和百度貼吧 。研究表明,最近幾年XSS已經(jīng)超過緩沖區(qū)溢出成為最流行的攻擊方式,有68%的網(wǎng)站可能遭受此類攻擊。根據(jù)開放網(wǎng)頁(yè)應(yīng)用安全計(jì)劃(Open Web Application Security Project)公布的2010年統(tǒng)計(jì)數(shù)據(jù),在Web安全威脅前10位中,XSS排名第2,僅次于代碼注入(Injection)。
|