【HTTP基礎】HTTP2.0簡介及web安全

HTTP2.0

HTTP2.0的目的就是經過支持請求與響應的多路複用來減小延遲、經過壓縮HTTP首部字段將協議開銷降至最低,同時增長對請求優先級和服務器端推送的支持,HTTP2.0不會改動HTTP的語義、HTTP方法、狀態碼、URI和首部字段等這些核心概念,可是HTTP2.0修改了數據傳輸的方式和數據格式化的方式。html

二進制分幀層

在傳輸層和應用層之間新增了二進制分幀層,它位於應用層以內,處於應用層可見的高層HTTP API之下的一個新機制,HTTP的語義不受影響,只是在傳輸期間對數據的編碼方式作出修改,HTTP1.x以換行符做爲純文本的分隔符,而HTTP2.0將全部傳輸的信息分割爲更小的消息和幀,並對它們採用二進制格式的編碼。前端

HTTP2.0中的新概念:java

  1. 流,已創建鏈接上的雙向字節流;
  2. 消息,與邏輯消息對應的完整的一系列數據幀,好比請求、響應等;
  3. 幀,HTTP2.0通訊的最小單位,每一個幀的首部含有流標識符。

全部的HTTP2.0的通訊都是在一個TCP鏈接上完成,這個TCP鏈接能夠承載任意數量的雙向數據流,相應的,每一個數據流以消息的形式發送,而消息由一個或多個幀組成,這些幀能夠亂序發送,而後再根據每一個幀首部的流標識符從新組裝。因爲全部的幀都採用二進制編碼,因此首部字段都會被壓縮。web

在HTTP1.x中,若是客戶端想發送多個並行的請求以改進性能,就必須使用多個TCP鏈接,HTTP2.0實現了多路複用,客戶端和服務器能夠把HTTP消息分解爲互不依賴的幀,而後亂序發送,最後在另外一端把它們從新組裝起來。這樣就能夠只使用一個TCP鏈接便可並行發送多個請求和響應。後端

請求優先級

把HTTP消息分解爲不少獨立的幀以後,就能夠經過優化這些幀的交錯和傳輸順序,進一步提高性能,爲了作到這一點,每一個流均可以攜帶有31bites的優先值。服務器能夠根據流的優先級,控制資源的分配,而在響應數據準備好以後,優先將最高優先級的幀發送給瀏覽器。跨域

服務器推送

在HTTP2.0,服務器能夠額外的向瀏覽器推送資源,當瀏覽器請求資源A時,而服務器知道它極可能也須要資源B,服務器能夠在瀏覽器發送請求前,主動將資源推送給客戶端。這個功能能夠幫助客戶端將資源B放進緩存。瀏覽器

首部壓縮

HTTP1.x的每一次通訊都會攜帶一組首部,用於描述傳輸的資源及其屬性,這一般會增長500-800字節的開銷,爲了減小這些開銷提高性能:緩存

  1. HTTP2.0會使用首部表來跟蹤和存儲以前發送的鍵值對,對於相同的數據,再也不經過每次請求和響應發送;
  2. 首部表在HTTP2.0鏈接持續期內始終存在,由服務器和瀏覽器漸進的更新;
  3. 每一個新的首部字段要麼被追加到當前首部表的末尾,要麼替換首部表以前的值;

在上面的例子中,第二次發送請求只須要發送變化了的字段,從而顯著的減小了每一個請求的開銷。安全

web安全

常見的前端安全問題包括如下幾點:服務器

  1. XSS攻擊
  2. iframe帶來的風險
  3. CSRF攻擊
  4. 網絡劫持攻擊

XSS攻擊

XSS是跨站腳本攻擊的簡稱,這類安全問題的本質緣由在於:瀏覽器錯誤的將攻擊者提供的用戶輸入數據當作JavaScript腳本給執行了。

1:用戶輸入框輸入的數據不通過處理直接展現在頁面上,該攻擊手段最簡單的防護方法就是將前端輸入的數據都進行轉義,好比將"<"、">"轉義爲"&lt;","&gt;"實體字符,這樣輸入數據裏面的<script></script>就不會被瀏覽器當作腳本執行了。可是在Jquery中,append()在添加元素的時候,會使用eval將參數裏面的<script>標籤腳本執行一遍,若是在攻擊時將"<",">"使用unicode碼假裝起來,好比:"u003cscriptu003ealert('a')",接下來在對輸入字符進行轉義的時候,假裝成"u003c"的"<"就會被漏掉,append的時候,則會被從新調用。這個時候須要將unicode碼的開頭"\"進行轉義處理。

2:img標籤的攻擊,img標籤在圖片加載失敗的時候,會調用該元素上的onerror事件,攻擊者能夠利用該機制進行攻擊。好比<img src="/" onerror="javaScript:alert(document.cookie);" />

3:若是後端從URL上獲取GET請求的參數時,直接使用該參數,就會把URL上的腳本帶到頁面上來。因此須要在前端對該參數進行html字符轉義。

可是不少時候XSS攻擊都防不勝防,若是頁面中被XSS攻擊了,頁面中用戶的敏感信息主要是存儲在cookie上的,這個時候應該使用cookie的HttpOnly屬性,把cookie設置爲只能HTTP請求使用,這樣JavaScript腳本就不能讀寫cookie了。

iframe帶來的風險

前端頁面有時會用到第三方的頁面組件,一般會以iframe的方式來引入,這樣會帶來很多的安全隱患。攻擊者能夠在iframe中運行JavaScript腳本,破壞前端的用戶體驗。若是iframe中的域名因過時而被攻擊者搶注,或者被第三方黑客攻破,iframe中的內容被替換掉,從而利用用戶瀏覽器中的安全漏洞下載安全木馬等等。

在HTML5中,iframe有sandbox的安全屬性,經過該屬性能夠對ifame的行爲進行各類限制,充分實現「最小權限」原則。sandbox屬性的參數有如下值:(IE10+)

  • allow-forms:容許iframe中提交form表單
  • allow-scripts:容許ifame中執行JavaScript
  • allow-same-origin:容許將內容做爲普通來源對待,若是不使用該關鍵字,嵌入內容將被視爲一個獨立的源。
  • allow-top-navigation:容許iframe可以主導window.top進行頁面跳轉
  • allow-popups:容許iframe中彈出新窗口,好比,window.open,target="_blank"
  • allow-pointer-lock:在iframe中能夠鎖定鼠標

若是sandbox只添加這個屬性而保持屬性爲空,那麼瀏覽器就對ifame實施最嚴厲的限制,就是除了容許顯示靜態資源之外,其餘什麼都作不了,好比不許提交表單,不許彈窗,不許執行腳本,連Origin都會被強制從新分配一個惟一的值,這樣iframe中的頁面訪問本身的服務器都會被算做跨域。

CSRF

CSRF是跨站請求僞造的簡稱,HTTP請求是無狀態的,爲了記錄用戶的狀態,服務器端通常會使用session技術,在某一次請求響應時(通常是登陸請求),服務器會將sessionId做爲cookie返回瀏覽器緩存起來,在接下來的每次請求中,請求頭都會攜帶該cookie傳輸給服務器,而CSRF攻擊就是利用用戶的cookie去完成一些惡意操做。

GET型CSRF:後臺程序爲了省事,會把應該提交數據的請求作成GET請求,刪除博客的請求/delete?id=1,那麼攻擊者只須要在評論區上傳<img src="/delete?id=1" />的腳本,只要頁面加載該評論,這篇博客就會被刪除掉。這樣就要嚴格要求提交數據的請求嚴格按照POST請求去作,更不要使用JSONP去作提交型接口。

POST型CSRF:誘導用戶點擊進入一個新的頁面,該頁面含有自動提交的表單,因爲新窗口是具備當前會話的,因此該表單的請求就會攜帶上用戶的cookie,從而進行惡意的操做,例如用戶登陸www.bank.com網站以後,被誘惑登陸www.hacker.com連接,該連接頁面發起一個post請求,因爲請求的域名爲www.bank.com,因此會攜帶該用戶的sessionId,而後進行轉帳等操做。

預防手段:1:在HTTP協議中,請求頭有referer字段,記錄該http請求的原地址,攻擊者僞造請求的頁面的域名爲www.hacker.com,因此服務器端就能夠判斷該請求非法,可是referer也有可能被篡改。2:token驗證,在用戶登陸時,將服務器隨機生成的token返回給前端緩存下來,在每次請求時自動攜帶上該token,這樣CSRF攻擊者無法知道token的值,該請求就被判斷爲非法。

網絡劫持攻擊

不少時候,咱們的網站不是直接就訪問咱們的服務器,中間會通過不少層的代理,若是在某一個環節,數據被中間層的劫持者所截獲,這樣就能獲取到用戶的帳號密碼等保密數據,好比用戶使用攻擊者創建的wife熱點,那麼攻擊者就能獲取該用戶收發的全部數據,這裏最好是都使用https訪問網站。

當使用https訪問網站的時候,最多見的攻擊方式就是SSL劫持攻擊和SSL剝離攻擊,SSL劫持須要將攻擊者接入到用戶和服務器中間,在傳輸的過程當中僞造SSL證書併發給瀏覽器,這種攻擊方式會引發瀏覽器的證書錯誤提示,若是用戶選擇繼續操做,那麼https傳輸的數據就能被攻擊者破解,SSL剝離攻擊也須要將攻擊者設置爲中間人,是利用http協議的重定向,將https協議訪問的網站從新重定向爲http協議訪問,因爲http協議傳輸的數據是明文的,這樣數據就能被攻擊者獲取。

相關文章
相關標籤/搜索