WWW服務依賴於Http協議實現,Http是無狀態的協議,所以為了在各個會話之間傳遞信息,就需要使用Cookie來標記訪問者的狀態,以便服務器端識別用戶信息。
Cookie由變量名與值組成,其屬性里有標准的cookie變量,也有用戶自定義的屬性。Cookie保存在瀏覽器的document對象中,對於存在XSS漏洞的網站,入侵者可以插入簡單的XSS語句執行任意的JS腳本,以XSS攻擊的手段獲取網站其余用戶的Cookie。
Cookie是通過http response header種到瀏覽器的,設置Cookie的語法為:
Set-Cookie:=[;=][;expiress=][;domain=][;path=][;secure][;httponly]
Cookie各個參數詳細內容:
-
Set-Cookie:http響應頭,向客戶端發送Cookie。
-
Name=value:每個Cookie必須包含的內容。
-
Expires=date:EXpires確定了Cookie的有效終止日期,可選。如果缺省,則Cookie不保存在硬盤中,只保存在瀏覽器內存中。
-
Domain=domain-name:確定了哪些inernet域中的web服務器可讀取瀏覽器儲存的Cookie,缺省為該web服務器域名。
-
Path=path:定義了web服務器哪些路徑下的頁面可獲取服務器發送的Cookie。
-
Secure:在cookie中標記該變量,表明只有為https通信協議時,瀏覽器才向服務器提交Cookie。
-
Httponly:禁止javascript讀取,如果cookie中的一個參數帶有httponly,則這個參數將不能被javascript獲取;httponly可以防止xss會話劫持攻擊。
想要獲取到用戶的Cookie,攻擊者通常是利用網站的XSS漏洞進行用戶Cookie的竊取,跨站腳本簡稱xss(cross-site scripting),利用方式主要是借助網站本身設計不嚴謹,導致執行用戶提交的惡意js腳本,對網站自身造成危害。xss漏洞是web滲透測試中最常見而又使用最靈活的一個漏洞。它允許惡意用戶將代碼注入到網頁上,其他用戶在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及用戶端腳本語言。
有的網站考慮到這個問題,所以采用瀏覽器綁定技術,例如將Cookie和瀏覽器的User-agent進行綁定,一旦發現綁定不匹配則認為Cookie失效,但是這種方法存在很大的弊端,因為當入侵者獲取到Cookie的同時也能獲取到用戶的User-agent;另一種防止XSS獲取用戶Cookie的方式是將Cookie和Remote-addr相綁定(即與IP綁定),但是這樣的弊端是可能會帶來極差的用戶體驗,如家里的ADSL撥號上網就是每次撥號連接更換一個IP地址。
所以HttpOnly就應運而生了 ⬇️
HttpOnly最早由微軟提出,並在IE6 中實現,至今已經逐漸成為一個標准,各大瀏覽器都支持此標准。具體含義就是,如果某個Cookie帶有HttpOnly屬性,那么這一條Cookie將被禁止讀取,也就是說,JavaScript讀取不到此條Cookie,不過在用戶與服務端交互的時候,HttpRequest包中仍然會帶上這個Cookie信息,即用戶與服務端的正常交互不受影響。
HttpOnly的設置過程十分簡單,而且效果明顯。可以看到在上面的Cookie的參數里面存在:
Httponly:禁止javascript讀取,如果cookie中的一個參數帶有httponly,則這個參數將不能被javascript獲取;httponly可以防止xss會話劫持攻擊。
該參數如其名,就是設置HttpOnly的。
但需要注意的是,所有需要設置Cookie的地方,都要給關鍵的Cookie添加上HttpOnly,若有遺漏的話就會功虧一簣。
另外,HttpOnly不是萬能的,添加了HttpOnly不等於解決了XSS問題,它有助於緩解XSS攻擊,但它並不能解決XSS漏洞的問題,也就是使用了HttpOnly只是在一定程度上抵御XSS盜取Cookie的行為,另外HttpOnly也不能防止入侵者做AJAX提交。嚴格來說HttpOnly並不是為了對抗XSS,它解決的是XSS后的Cookie劫持問題,但是XSS攻擊帶來的不僅僅是Cookie劫持問題,還有竊取用戶信息,模擬身份登錄,操作用戶賬戶等一系列問題。所以除了HttpOnly之外還需要其他的對抗解決方案。
安全是一個整體,網絡安全沒有銀彈,最好的應對方式是抓住當下,腳踏實地,所有妄想一步解決所有問題的都是耍流氓
參考鏈接:
https://juejin.im/post/5bac9e21f265da0afe62ec1b
https://www.biaodianfu.com/http-only-cookie-xss.html