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),能力有限,不足之處,歡迎各位斧正~