你必須知道的session與cookie


Session本質

提到Session我們能聯想到的就是用戶登錄功能,而本身我們使用Session的基礎是通過url進行訪問的,也就是使用http協議進行訪問的,而http協議本身是無狀態的,那么問題來了服務器端是怎么驗證客戶端身份的?

:服務器端和客戶端驗證的聯系就是sessionid,登錄成功之后服務器會自動給客戶端一個session標識也就是sessionid,而sessionid會存儲到客戶端的cookie里面,每次請求的時候都會帶上這個標識,用來讓服務器端驗證身份的。服務器端的sessionid一般是存儲在內存中的,通過某種算法加密存儲到服務器上,客戶端就存儲到cookie里面,當頁面關閉的時候客戶端的sessionid就會消失,而服務器端的session不會因為客戶端的消失而關閉,而是通過他本身設置過期時間之后,才會失效。

總結來說,session本身就是通過存儲在客戶端的sessionid進行身份驗證。

那么問題來了,如果客戶端的sessionid被讀取到,就可以偽裝身份,對系統進行破壞了,這就是存儲型XSS了,那怎么來處理怎么問題呢?這就是接下來要說的Cookie了。

 

Cookie屬性HttpOnly

定義:如果cookie中設置了HttpOnly屬性,那么通過js腳本將無法讀取到cookie信息,這樣能有效的防止XSS攻擊,竊取cookie內容,這樣就增加了cookie的安全性。

解釋:也就是說服務器端設置了HttpOnly之后,客戶端是無法通過document.cookie獲取到cookie值了,這樣就有效的緩解了XSS攻擊。

服務器設置HttpOnly方法:

asp.net:

HttpCookie myCookie = new HttpCookie("myCookie");  
myCookie.HttpOnly = true;  
Response.AppendCookie(myCookie);

express(nodejs):

res.cookie('rememberme', '1', {httpOnly: true });  

然而,設置HttpOnly只能一定程度的阻止XSS,如果http在傳輸過程中被劫持了,該怎樣處理這個問題呢?那就是接下來要說的Cookie的另一個屬性Secure了。

 

Cookie屬性Secure

定義:當Secure屬性設置為true時,cookie只有在https協議下才能上傳到服務器,而在http協議下是沒法上傳的,所以也不會被竊聽。

解釋:當Secure=true時,客戶端的Cookie是不會上傳到服務器端的(http協議)。

asp.net

HttpCookie myCookie = new HttpCookie("myCookie");  
//...
myCookie.SecurePolicy = CookieSecurePolicy.Always;
Response.AppendCookie(myCookie);

express(nodejs)

var app = express()
var sess = {
  secret: 'keyboard cat',
  cookie: {}
}

if (app.get('env') === 'production') {
  app.set('trust proxy', 1) // trust first proxy
  sess.cookie.secure = true // serve secure cookies
}

app.use(session(sess))

參考資料:https://github.com/expressjs/session

 

末尾

到此,本文已到尾聲,主要介紹了Session的原理,以及Cookie兩個非常重要的安全屬性的設置(HttpOnly/Secure),能力有限,不足之處,歡迎各位斧正~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM