你會做Web上的用戶登錄功能嗎?

Web上的用戶登錄功能應該是最基本的功能了,可是在我看過一些站點的用戶登錄功能后,我覺得很有必要寫一篇文章教大家怎么來做用戶登錄功能。下面的文章告訴大家這個功能可能并沒有你所想像的那么簡單,這是一個關系到用戶安全的功能,希望大家能從下面的文章中能知道什么樣的方法才是一個好的用戶登錄功能。

用戶名和口令

首先,我們先來說說用戶名和口令的事。這并不是本站第一次談論這個事了。如何管理自己的口令讓你知道怎么管理自己的口令,破解你的口令讓你知道在現代這樣速度的計算速度下,用窮舉法破解你的口令可能會是一件很輕松的事。在這里我想告訴從開發者的角度上來做設計這個用戶名和口令的事。下面一幾件規則:

  • 限制用戶輸入一些非常容易被破解的口令。如什么qwert,123456, password之類,就像twitter限制用戶的口令一樣做一個口令的黑名單。另外,你可以限制用戶口令的長度,是否有大小寫,是否有數字,你可以用你的程序做一下校驗。當然,這可能會讓用戶感到很不爽,所以,現在很多網站都提供了UX讓用戶知道他的口令強度是什么樣的(比如這個有趣的UX),這樣可以讓用戶有一個選擇,目的就是告訴用戶——要想安全,先把口令設得好一點。

  • 千萬不要明文保存用戶的口令。正如如何管理自己的口令所說的一樣,很多時候,用戶都會用相同的ID相同的口令來登錄很多網站。所以,如果你的網站明文保存的話,那么,如果你的數據被你的不良員工流傳出去那對用戶是災難性的。所以,用戶的口令一定要加密保存,最好是用不可逆的加密,如MD5或是SHA1之類的有hash算法的不可逆的加密算法。CSDN曾明文保存過用戶的口令。(另,對于國內公司的品行以及有關部門的管理方式,我不敢保證國內網站以加密的方式保存你的口令。我覺得,做為一個有良知的人,我們應該加密保存用戶的口令)

  • 是否讓瀏覽器保存口令。我們有N多的方法可以不讓瀏覽器保存用戶名和口令。但是這可能對用戶來說很不爽。因為在真實世界里誰也記得不住那么多的口令。很多用戶可能會使用一些密碼管理工具來保存密碼,瀏覽器只是其中一種。是否讓瀏覽器保存這個需要你做決定,重點是看一下你的系統的安全級別是否要求比較高,如果是的話,則不要讓瀏覽器保存密碼,并在網站明顯的位置告訴用戶——保存口令最安全的地方只有你的大腦。

  • 口令在網上的傳輸。因為HTTP是明文協議,所以,用戶名和口令在網上也是明文發送的,這個很不安全。你可以看看這篇文章你就明白了。要做到加密傳輸就必需使用HTTPS協議。但是,在中國還是有很多網站的Web登錄方式還在使用ActiveX控件,這可能成為IE6還大量存在的原因。我通常理解為這些ActiveX控件是為了反鍵盤記錄程序的。 不過,我依然覺ActiveX控件不應該存在,因為在國外的眾多安全很重要的站點上都看不到ActiveX的控件的身影。

用戶登錄狀態

首先,我想告訴大家的是,因為HTTP是無狀態的協議,也就是說,這個協議是無法記錄用戶訪問狀態的,其每次請求都是獨立的無關聯的,一筆是一筆。而我們的網站都是設計成多個頁面的,所在頁面跳轉過程中我們需要知道用戶的狀態,尤其是用戶登錄的狀態,這樣我們在頁面跳轉后我們才知道是否可以讓用戶有權限來操作一些功能或是查看一些數據。

所以,我們每個頁面都需要對用戶的身份進行認證。當然,我們不可能讓用戶在每個頁面上輸入用戶名和口令,這會讓用戶覺得我們的網站相當的SB。為了實現這一功能,用得最多的技術就是瀏覽器的cookie,我們會把用戶登錄的信息存放在客戶端的cookie里,這樣,我們每個頁面都從這個cookie里獲得用戶是否登錄的信息,從而達到記錄狀態,驗證用戶的目的。但是,你真的會用cookie嗎?下面是使用cookie的一些原則:

  • 千萬不要在cookie中存放用戶的密碼。加密的密碼都不行。因為這個密碼可以被人獲取并嘗試離線窮舉。所以,你一定不能把用戶的密碼保存在cookie中。我看到太多的站點這么干了。

  • 正確設計“記住密碼”。這個功能簡直就是一個安全隱患,我覺得并不是所有的程序員都知道怎么設計這個事。一般的設計 是——一時用戶勾選了這個功能,系統會生成一個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相同 ,那么,我們無需更新服務器的"登錄序列"和"登錄"(但需要更新cookie)。因為我們認為是同一用戶有同一IP(當然,同一個局域網里也有同一IP,但我們認為這個局域網是用戶可以控制的。網吧內并不推薦使用這一功能)。
    c) 如果 (IP不同 && 沒有用口令登錄),那么,“登錄token” 就會在多個IP間發生變化(登錄token在兩個或多個ip間被來來回回的變換),當在一定時間內達到一定次數后,系統才會真正覺得被盜用的可能性很高,此時系統在后臺清除“登錄序列”和“登錄token“,讓Cookie失效,強制用戶輸入口令(或是要求用戶更改口令),以保證多臺設備上的cookie一致。

  • 不要讓cookie有權限訪問所有的操作
    否則就是XSS攻擊,這個功能請參看新浪微博的XSS攻擊。下面的這些功能一定要用戶輸入口令:
    1)修改口令。
    2)修改電子郵件。(電子郵件通常用來找回用戶密碼,最好通發郵件或是發手機短信的方式修改,或者干脆就不讓改一一用電子郵件做帳號名)
    3)用戶的隱私信息。
    4)用戶消費功能。

  • 權衡Cookie的過期時間
    如果是永不過期,會有很不錯的用戶體驗,但是這也會讓用戶很快就忘了登錄密碼。如果設置上過期期限,比如2周,一個月,那么可能會好一點,但是2周和一個月后,用戶依然會忘了密碼。尤其是用戶在一些公共電腦上,如果保存了永久cookie的話,等于泄露了帳號。所以,對于cookie的過期時間我們還需要權衡。

找回口令的功能

找回口令的功能一定要提供。但是很多朋友并不知道怎么來設計這個功能。我們有很多找回口令的設計,下面我逐個點評一下。

  • 千萬不要使用安全問答。事實證明,這個環節很煩人,而且用戶并不能很好的設置安全問答。什么,我的生日啊,我母親的生日,等等。因為今天的互聯網和以前不一樣了,因為SNS,今天的互聯比以前更真實了,我可以上facebook,開心,人人網,LinkedIn查到你的很多的真實的信息。通過這些信息我可以使用安全問答來重設你的口令。 這里需要說一下 Facebook,Facebook的安全問答很強大,還要你通過照片認人,呵呵。

  • 不要重置用戶的密碼。因為這有可能讓用戶的密碼遭到惡意攻擊。當然,你要發個郵件給用戶讓其確認,用戶點擊郵件中的一個鏈接,你再重置。我并不推薦這樣的方法,因為用戶一般都會用筆記下來這個很難記的口令,然后登錄系統,因為登錄系統時使用了“記住密碼”的功能,所以導致用戶不會去修改密碼,從而要么導到被寫下來的密碼被人盜取,要么又忘記了密碼。

  • 好一點的做法——通過郵件自行重置。當用戶申請找回口令功能的時候,系統生成一個MD5唯一的隨機字串(可通過UID+IP+timestamp+隨機數),放在數據庫中,然后設置上時限(比如1小時內),給用戶發一個郵件,這個連接中包含那個MD5的字串的鏈接,用戶通過點擊那個鏈接來自己重新設置新的口令。

  • 更好一點的做法——多重認證。比如:通過手機+郵件的方式讓用戶輸入驗證碼。手機+郵件可能還不把握,因為手機要能會丟了,而我的手機可以訪問我的郵箱。所以,使用U盾,SecureID(一個會變化的6位數token),或是通過人工的方式核實用戶身份。當然,這主要看你的系統的安全級別了。

口令探測防守

  • 使用驗證碼。驗證碼是后臺隨機產生的一個短暫的驗證碼,這個驗證碼一般是一個計算機很難識別的圖片。這樣就可以防止以程序的方式來嘗試用戶的口令。事實證明,這是最簡單也最有效的方式。當然,總是讓用戶輸入那些肉眼都看不清的驗證碼的用戶體驗不好,所以,可以折中一下。比如Google,當他發現一個IP地址發出大量的搜索后,其會要求你輸入驗證碼。當他發現同一個IP注冊了3個以上的gmail郵箱后,他需要給你發短信方式或是電話方式的驗證碼。

  • 用戶口令失敗次數。調置口令失敗的上限,如果失敗過多,則把帳號鎖了,需要用戶以找回口令的方式來重新激活帳號。但是,這個功能可能會被惡意人使用。最好的方法是,增加其嘗試的時間成本(以前的這篇文章說過一個增加時間成本的解密算法)。如,兩次口令嘗試的間隔是5秒鐘。三次以上錯誤,帳號被臨時鎖上30秒,5次以上帳號被鎖1分鐘,10次以上錯誤帳號被鎖4小時……但是這會導致惡意用戶用腳本來攻擊,所以最好再加上驗證碼,驗證碼出錯次數過多不禁止登錄而是禁lP。

  • 系統全局防守。上述的防守只針對某一個別用戶。惡意者們深知這一點,所以,他們一般會動用“僵尸網絡”輪著嘗試一堆用戶的口令,所以上述的那種方法可能還不夠好。我們需要在系統全局域上監控所有的口令失敗的次數。當然,這個需要我們平時沒有受到攻擊時的數據做為支持。比如你的系統,平均每天有5000次的口令錯誤的事件,那么你可以認為,當口令錯誤大幅超過這個數后,而且時間相對集中,就說明有黑客攻擊。這個時候你怎么辦?一般最常見使用的方法是讓所有的用戶輸錯口令后再次嘗試的時間成本增加。

最后,再說一下,關于用戶登錄,使用第三方的 OAuth 和 OpenID 也不失為一個很不錯的選擇。

參考文章

文章內容轉載自 酷 殼 – CoolShell.cn ,作者 陳皓 , 原文 鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容