引言:
公司面試的時候問了我這么一個關於用戶登錄的安全性問題,當時我簡單的表述了一下我對於http請求的特點:短連接和無狀態。(奇怪的是我好像答得不是很好,但是公司還是要我了,O(∩_∩)O哈哈~)。這里我就記錄一下我對於B/S結構的http請求的理解,如果有錯誤之處還請各位看官多多之處,謝謝!
一、短連接
Client端向Service端請求一份報表數據,此時C端和S端就會建立起一個連接,當S端將報表數據反饋給C端之后這個連接就會斷開消失。如果C端過了一段時間又需要數據了,那么需要再次建立一個連接
媽耶。。。1.1及以后是長連接了,打擾了
問題:
這個短連接方面我也不太明白,如果相應/請求是一次連接那么如果用戶在等待響應的時候中斷了請求,服務器按理說是很好監聽到的呀。但是有一種情況,如果一個請求在S端需要處理10S,當C端請求1S之后刷新了頁面(或者其他方法,中斷了請求連接),S端會任然相應出個10S的處理。解決方法這里有一個:
https://mp.weixin.qq.com/s/Y9q4Orz14VHwGf2U-AAzeQ
但是.net下如何處理呢?
二、無狀態
什么是無狀態呢。我的個人理解是,每一個請求都是一樣的,沒有區別的。舉一個栗子:張三和李四兩個用戶都想服務器請求一份報表數據,這個時候服務器是無法卻分哪個請求是張三的哪個請求是李四的,這樣就可能造成數據的錯誤,把張三的報表給了李四,李四的報表給了張三。
1、Cookie
這個時候為了區分誰是張三誰是李四,就需要標記一下,那么張三在請求的時候加上一個標記,說“我是張三”,李四請求的時候加上一個標記說“我是李四”,這樣子服務器就可以區分誰是張三誰是李四了。這個標記就是Cookie,每次http請求的時候都會把客戶端的Cookie帶上。
2、Session
如果單純的把信息都放在客戶端上面很不安全,張三可以把自己的信息修改為“我是李四”從而獲取到李四的報表(不考慮Cookie加密)。那么還有一種方式,當張三登錄系統的時候,我們將張三的個人信息存放在服務器端,並給張三一個key,服務器憑借這個key可以在自己的倉庫(iis/內存/文件/數據庫)中找到張三的信息。
情景如下:
張三登錄系統,獲取到服務器給的key。張三向服務器請求報表,並附上key。服務器根據key找到了張三的信息,確認該請求是登錄過的用戶。
所以Session其實和Cookie是一樣的,但是Session是將實際內容存放在服務器端,而Cookie是將內容存放在了客戶端(不考慮加密)。
留意一下就可以在使用Session的.net網站中的Cookie看到這樣一個值:
這個就是Session的key。
問題:
當時公司面試我問的是BS的登錄驗證問題,我將上述我個人對http請求的理解闡述了一遍之后又問了我這么一個問題:
如果通過抓包等手段截取到了用戶登錄的Session的key,之后不就可以憑借這個Key登錄了嗎?有別的安全手段嗎?
我當時蒙了,因為按照我的認知,如果獲取到了Session的Key,那么這個請求就完全是用戶請求而不是非法請求了(無狀態啊)。
后來想想可能問我的是如果獲取到了key之后頻繁請求占用資源吧?(緩存、IP黑名單、冷熱數據分庫)
希望以后有空問一下當初面試我的到底怎么弄。
補充第二個問題,關鍵詞:CSRF
https://blog.csdn.net/stpeace/article/details/53512283