“記住密碼“功能的正確設計

這個功能簡直就是一個安全隱患,我覺得並不是所有的程序員都知道怎麼設計這個事。一般的設計 是——一時用戶勾選了這個功能,系統會生成一個cookie,cookie包括用戶名和一個固定的散列值,這個固定的散列值一直使用。這樣,你就可以在所有的設備和客戶上都可以登錄,而且可以有多個用戶同時登錄。這個並不是很安全。下面是一些更爲安全的方法供你參考:

1)在cookie中,保存三個東西——用戶名登錄序列登錄token

用戶名:明文存放。
登錄序列:一個被MD5散列過的隨機數,僅當強制用戶輸入口令時更新(如:用戶修改了口令)
登錄token:一個被MD5散列過的隨機數,僅一個登錄session內有效,新的登錄session會更新它

2)上述三個東西會存在服務器上,服務器的驗證用戶需要驗證客戶端cookie裏的這三個事。

3)這樣的設計會有什麼樣的效果,會有下面的效果,

a)登錄token是單實例登錄。意思就是一個用戶只能有一個登錄實例。

b)登錄序列是用來做盜用行爲檢測的。如果用戶的cookie被盜後,盜用者使用這個cookie訪問網站時,我們的系統是以爲是合法用戶,然後更新“登錄token”,而真正的用戶回來訪問時,系統發現只有“用戶名”和“登錄序列”相同,但是“登錄token” 不對,這樣的話,系統就知道,這個用戶可能出現了被盜用的情況,於是,系統可以清除並更改登錄序列 登錄token,這樣就可以令所有的cookie失效,並要求用戶輸入口令。並給警告用戶系統安全。

4)當然,上述這樣的設計還是會有一些問題,比如:同一用戶的不同設備登錄,甚至在同一個設備上使用不同的瀏覽器保登錄。一個設備會讓另一個設備的登錄token登錄序列失效,從而讓其它設備和瀏覽器需要重新登錄,並會造成cookie被盜用的假象。所以,你在服務器服還需要考慮- IP 地址

a) 如果以口令方式登錄,我們無需更新服務器的“登錄序列”和 “登錄token”(但需要更新cookie)。因爲我們認爲口令只有真正的用戶知道。

b) 如果 IP相同 ,那麼,我們無需更新服務器的“登錄序列”和 “登錄token”(但需要更新cookie)。因爲我們認爲是同一用戶有同一IP(當然,同一個局域網裏也有同一IP,但我們認爲這個局域網是用戶可以控制的。網吧內並不推薦使用這一功能)。

c) 如果 (IP不同 && 沒有用口令登錄),那麼,“登錄token” 就會在多個IP間發生變化(登錄token在兩個或多個ip間被來來回回的變換),當在一定時間內達到一定次數後,系統纔會真正覺得被盜用的可能性很高,此時系統在後臺清除“登錄序列”和“登錄token“,讓Cookie失效,強制用戶輸入口令(或是要求用戶更改口令),以保證多臺設備上的cookie一致。

我覺得這是一種不錯的方案,cookies被盜的假象甚至可以“弄巧成拙”地實現——QQ的後來登錄用戶擠掉之前的登錄用戶這樣的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章