如何设计安全的用户登录功能
用戶登錄功能是Web應用系統具備的最基本的功能,關系到用戶數據和應用系統數據的安全,設計一個安全的用戶登錄功能,涉及到以下幾個方面的內容。
(一) 老生常談——口令
1. 口令長度與復雜度限制
限制用戶輸入一些非常容易被破解的口令,比如qwert、asdfg、123456、password之類的,參考twitter和 facebook的設計,為這樣的口令做一個黑名單,不允許使用黑名單中的口令。同時,還對用戶口令的長度、復雜度進行檢查,要求用戶設置足夠長度,且復 雜度符合安全策略的口令。
在口令安全的這個方面,用戶體驗和安全可能是相對的。限制用戶輸入某些口令及口令的長度和復雜度,在用戶體驗方面可能并不太好。所以,很多成功且 設計良好的社交網站(SNS)都提供了UX讓用戶知道他的口令強度是什么樣的,這樣可以讓用戶有一個選擇,目的就是告訴用戶——要想安全,先把口令設得好 一點。
2. 不要明文保存用戶的口令
用戶都會用相同的ID相同的口令來登錄很多網站。所以,如果Web應用系統明文保存口令的話,那么,數據被不良員工流傳出去那對用戶將是災難性的。所以,用戶的口令一定要加密保存,最好是用不可逆的加密,但不要直接使用諸如MD5或是SHA1之類加密算法。
3. 不要讓瀏覽器保存口令
瀏覽器記住口令,對用戶來說是很方便的事,因為用戶不可能記住那么多的口令,只能借助于某些工具幫助記憶,瀏覽器只是其中的一種。但對于用戶數據的安全來說,有很多方法可以獲取瀏覽器記住的口令。所以,不要讓瀏覽器保存用戶名和口令。
(二) 用戶登錄狀態
HTTP是無狀態的協議,是無法記錄用戶訪問狀態的。用戶的每次請求都是獨立的無關聯的,一筆是一筆。而我們的Web應用系統都是設計成多個頁面 的,在頁面跳轉過程中我們需要知道用戶的狀態,尤其是用戶登錄的狀態,這樣我們在頁面跳轉后我們才知道是否可以讓用戶有權限來操作一些功能或是查看一些數 據。
我們每個頁面都需要對用戶的身份進行認證。當然,我們不可能讓用戶在每個頁面上輸入用戶名和口令。為了實現這一功能,Web應用系統會把用戶登錄 的信息存放在客戶端的Cookie里,每個頁面都從這個Cookie里獲得用戶是否登錄的信息,從而達到記錄狀態,驗證用戶的目的。但是,Cookie的 使用并不是簡單的事,下面是使用Cookie的一些原則。
1. 千萬不要在Cookie中存放用戶的密碼
千萬不要在Cookie中存放用戶的密碼,加密的密碼都不行。因為這個密碼可以被人獲取并嘗試離線窮舉。所以,一定不能把用戶的密碼保存在Cookie中。
2. 正確的設計“記住密碼”
這個功能簡直就是一個安全隱患,通常的設計是用戶戶勾選了這個功能,系統會生成一個Cookie。Cookie包括用戶名和一個固定的散列值,這個固定的散列值一直使用。這樣,可以在所有的設備和客戶上都可以登錄,而且可以有多個用戶同時登錄。更安全一點的做法是:
1) 在Cookie中,保存三個東西——用戶名,登錄序列,登錄Token
? 用戶名:明文存放。
? 登錄序列:一個被MD5散列過的隨機數,僅當強制用戶輸入口令時更新(如:用戶修改了口令)。
? 登錄Token:一個被MD5散列過的隨機數,僅一個登錄Session內有效,新的登錄Session會更新它。
2) 上述三個要素會存在服務器上,服務器需要驗證客戶端Cookie里的這三個要素。
登錄Token是單實例登錄,意思就是一個用戶只能有一個登錄實例。登錄序列是用來做盜用行為檢測的。
如果用戶的Cookie被盜后,盜用者使用這個Cookie訪問網站時,我們的系統是以為是合法用戶,然后更新“登錄Token”。而真正的用戶 回來訪問時,系統發現只有“用戶名”和“登錄序列”相同,但是“登錄Token” 不對,這樣的話,系統就知道,這個用戶可能出現了被盜用的情況。于是,系統可以清除并更改登錄序列 和 登錄Token,這樣就可以令所有的Cookie失效,并要求用戶輸入口令。并給警告用戶系統安全。
3. 不要讓Cookie有權限訪問所有的操作
參考新浪微博的XSS攻擊,即使Cookie有權限訪問登錄之后的所有操作。下面的這些功能一定要用戶輸入口令:
? 修改口令。
? 修改電子郵件。
? 用戶的隱私信息。
? 涉及金錢的用戶消費功能。
(三) 找回口令功能
找回口令的功能一定要提供,目前常用的找回口令功能大致有以下幾種:
1) 安全問答。
事實證明,這個環節很煩人,而且用戶并不能很好的設置安全問答。什么,我的生日啊,我母親的生日,等等。因為今天的互聯網和以前不一樣了,因為SNS,今天的互聯比以前更真實了,在facebook,開心,人人網,LinkedIn查到很多的真實的信息。
2) 重置用戶的密碼。
這有可能讓用戶的密碼遭到惡意攻擊
3) 安全一點的做法——通過郵件自行重置。
當用戶申請找回口令功能的時候,系統生成一個MD5唯一的隨機字串(可通過UID+IP+timestamp+隨機數),放在數據庫中,然后設置 上時限(比如1小時內),給用戶發一個郵件,這個連接中包含那個MD5的字串的鏈接,用戶通過點擊那個鏈接來自己重新設置新的口令。
4) 更安全一點的做法——多重認證。
比如:通過手機+郵件的方式讓用戶輸入驗證碼,還可以使用數字證書、動態口令等方式。是否使用多重認證,主要取決于Web應用系統的重要性程度。
(四) 防御暴力破解
1) 使用驗證碼。
驗證碼是后臺隨機產生的一個短暫的驗證碼,這個驗證碼一般是一個計算機很難識別的圖片。這樣就可以防止以程序的方式來嘗試用戶的口令。
事實證明,這是最簡單也最有效的方式。當然,總是讓用戶輸入那些肉眼都看不清的驗證碼的用戶體驗不好,所以,可以折中一下。比如Google,當發現一個IP地址發出大量的搜索后,其會要求你輸入驗證碼。
2) 用戶口令失敗次數
設置口令失敗的上限,如果失敗過多,則把帳號鎖了,需要用戶以找回口令的方式來重新激活帳號。
但是,這個功能可能會被惡意人使用,造成用戶賬戶不能使用(這是一種變相的拒絕服務攻擊)。更好的方法是,結合IP地址做驗證,同時增加嘗試破解 的時間成本。如,兩次口令嘗試的間隔是5秒鐘。三次以上錯誤,帳號被臨時鎖上30秒,5次以上帳號被鎖1分鐘,10次以上錯誤帳號被鎖4小時等等。如果發 現來自同一IP地址的錯誤次數太多,正確的做法是禁止這個用戶在這個IP地址登錄,而不是單純的禁止用戶登錄。
?
注:轉載于http://qq405371160.iteye.com/blog/1743237
轉載于:https://www.cnblogs.com/wcyBlog/p/3820353.html
總結
以上是生活随笔為你收集整理的如何设计安全的用户登录功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 响应式布局---菜单
- 下一篇: Window.document对象