web實(shí)現(xiàn)自動(dòng)登錄功能

關(guān)于如何實(shí)現(xiàn)web上的自動(dòng)登錄功能

文章來源http://coolshell.cn/articles/5353.html

Web上的用戶登錄功能應(yīng)該是最基本的功能了,可是在我看過一些站點(diǎn)的用戶登錄功能后,我覺得很有必要寫一篇文章教大家怎么來做用戶登錄功能。下面的文章告訴大家這個(gè)功能可能并沒有你所想像的那么簡(jiǎn)單,這是一個(gè)關(guān)系到用戶安全的功能,希望大家能從下面的文章中能知道什么樣的方法才是一個(gè)好的用戶登錄功能。以下內(nèi)容,轉(zhuǎn)載時(shí)請(qǐng)保持原文一致,并請(qǐng)注明作者和出處。

用戶名和口令

首先,我們先來說說用戶名和口令的事。這并不是本站第一次談?wù)撨@個(gè)事了。如何管理自己的口令讓你知道怎么管理自己的口令,破解你的口令讓你知道在現(xiàn)代這樣速度的計(jì)算速度下,用窮舉法破解你的口令可能會(huì)是一件很輕松的事。在這里我想告訴從開發(fā)者的角度上來做設(shè)計(jì)這個(gè)用戶名和口令的事。下面一幾件規(guī)則:

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

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

  • 是否讓瀏覽器保存口令。 我們有N多的方法可以不讓瀏覽器保存用戶名和口令。 但是這可能對(duì)用戶來說很不爽。因?yàn)樵谡鎸?shí)世界里誰也記得不住那么多的口令。 很多用戶可能會(huì)使用一些密碼管理工具來保存密碼,瀏覽器只是其中一種。 是否讓瀏覽器保存這個(gè)需要你做決定,重點(diǎn)是看一下你的系統(tǒng)的安全級(jí)別是否要求比較高, 如果是的話,則不要讓瀏覽器保存密碼,并在網(wǎng)站明顯的位置告訴用戶——保存口令最安全的地方只有你的大腦。

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

用戶登錄狀態(tài)

首先,我想告訴大家的是,因?yàn)镠TTP是無狀態(tài)的協(xié)議,也就是說,這個(gè)協(xié)議是無法記錄用戶訪問狀態(tài)的, 其每次請(qǐng)求都是獨(dú)立的無關(guān)聯(lián)的,一筆是一筆。 而我們的網(wǎng)站都是設(shè)計(jì)成多個(gè)頁(yè)面的,所在頁(yè)面跳轉(zhuǎn)過程中我們需要知道用戶的狀態(tài), 尤其是用戶登錄的狀態(tài),這樣我們?cè)陧?yè)面跳轉(zhuǎn)后我們才知道是否可以讓用戶有權(quán)限來操作一些功能或是查看一些數(shù)據(jù)。

所以,我們每個(gè)頁(yè)面都需要對(duì)用戶的身份進(jìn)行認(rèn)證。 當(dāng)然,我們不可能讓用戶在每個(gè)頁(yè)面上輸入用戶名和口令,這會(huì)讓用戶覺得我們的網(wǎng)站相當(dāng)?shù)腟B。 為了實(shí)現(xiàn)這一功能,用得最多的技術(shù)就是瀏覽器的cookie,我們會(huì)把用戶登錄的信息存放在客戶端的cookie里, 這樣,我們每個(gè)頁(yè)面都從這個(gè)cookie里獲得用戶是否登錄的信息,從而達(dá)到記錄狀態(tài),驗(yàn)證用戶的目的。 但是,你真的會(huì)用cookie嗎?下面是使用cookie的一些原則。

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

  • 正確設(shè)計(jì)“記住密碼”。 這個(gè)功能簡(jiǎn)直就是一個(gè)安全隱患,我覺得并不是所有的程序員都知道怎么設(shè)計(jì)這個(gè)事。 一般的設(shè)計(jì) 是——一時(shí)用戶勾選了這個(gè)功能,系統(tǒng)會(huì)生成一個(gè)cookie,cookie包括用戶名和一個(gè)固定的散列值, 這個(gè)固定的散列值一直使用。 這樣,你就可以在所有的設(shè)備和客戶上都可以登錄,而且可以有多個(gè)用戶同時(shí)登錄。 這個(gè)并不是很安全。下面是一些更為安全的方法供你參考:

    • 在cookie中,保存三個(gè)東西——用戶名,登錄序列,登錄token用戶名:明文存放。 登錄序列:一個(gè)被MD5散列過的隨機(jī)數(shù),僅當(dāng)強(qiáng)制用戶輸入口令時(shí)更新(如:用戶修改了口令)。 登錄token:一個(gè)被MD5散列過的隨機(jī)數(shù),僅一個(gè)登錄session內(nèi)有效,新的登錄session會(huì)更新它。
    • 上述三個(gè)東西會(huì)存在服務(wù)器上,服務(wù)器的驗(yàn)證用戶需要驗(yàn)證客戶端cookie里的這三個(gè)事。
    • 這樣的設(shè)計(jì)會(huì)有什么樣的效果,會(huì)有下面的效果,
      • a) 登錄token 是單實(shí)例登錄。意思就是一個(gè)用戶只能有一個(gè)登錄實(shí)例。
      • b) 登錄序列 是用來做盜用行為檢測(cè)的。 如果用戶的cookie被盜后,盜用者使用這個(gè)cookie訪問網(wǎng)站時(shí),我們的系統(tǒng)是以為是合法用戶, 然后更新“登錄token”,而真正的用戶回來訪問時(shí),系統(tǒng)發(fā)現(xiàn)只有“用戶名”和“登錄序列”相同, 但是“登錄token” 不對(duì),這樣的話,系統(tǒng)就知道,這個(gè)用戶可能出現(xiàn)了被盜用的情況, 于是,系統(tǒng)可以清除并更改登錄序列 和 登錄token,這樣就可以令所有的cookie失效,并要求用戶輸入口令。 并給警告用戶系統(tǒng)安全。
    • 當(dāng)然,上述這樣的設(shè)計(jì)還是會(huì)有一些問題,比如:同一用戶的不同設(shè)備登錄,甚至在同一個(gè)設(shè)備上使用不同的瀏覽器保登錄。一個(gè)設(shè)備會(huì)讓另一個(gè)設(shè)備的登錄token和登錄序列失效,從而讓其它設(shè)備和瀏覽器需要重新登錄,并會(huì)造成cookie被盜用的假象。所以,你在服務(wù)器服還需要考慮- IP 地址,
      • a) 如果以口令方式登錄,我們無需更新服務(wù)器的“登錄序列”和 “登錄token”(但需要更新cookie)。因?yàn)槲覀冋J(rèn)為口令只有真正的用戶知道。
      • b) 如果 IP相同 ,那么,我們無需更新服務(wù)器的“登錄序列”和 “登錄token”(但需要更新cookie)。因?yàn)槲覀冋J(rèn)為是同一用戶有同一IP(當(dāng)然,同一個(gè)局域網(wǎng)里也有同一IP,但我們認(rèn)為這個(gè)局域網(wǎng)是用戶可以控制的。網(wǎng)吧內(nèi)并不推薦使用這一功能)。
      • c) 如果 (IP不同 && 沒有用口令登錄),那么,“登錄token” 就會(huì)在多個(gè)IP間發(fā)生變化(登錄token在兩個(gè)或多個(gè)ip間被來來回回的變換),當(dāng)在一定時(shí)間內(nèi)達(dá)到一定次數(shù)后,系統(tǒng)才會(huì)真正覺得被盜用的可能性很高,此時(shí)系統(tǒng)在后臺(tái)清除“登錄序列”和“登錄token“,讓Cookie失效,強(qiáng)制用戶輸入口令(或是要求用戶更改口令),以保證多臺(tái)設(shè)備上的cookie一致。
  • 不要讓cookie有權(quán)限訪問所有的操作。 否則就是XSS攻擊,這個(gè)功能請(qǐng)參看新浪微博的XSS攻擊。 下面的這些功能一定要用戶輸入口令:

    • 修改口令。
    • 修改電子郵件。(電子郵件通常用來找回用戶密碼,最好通發(fā)郵件或是發(fā)手機(jī)短信的方式修改,或者干脆就不讓改一一用電子郵件做帳號(hào)名)
    • 用戶的隱私信息。
    • 用戶消費(fèi)功能。
  • 權(quán)衡Cookie的過期時(shí)間。 如果是永不過期,會(huì)有很不錯(cuò)的用戶體驗(yàn),但是這也會(huì)讓用戶很快就忘了登錄密碼。 如果設(shè)置上過期期限,比如2周,一個(gè)月,那么可能會(huì)好一點(diǎn),但是2周和一個(gè)月后,用戶依然會(huì)忘了密碼。 尤其是用戶在一些公共電腦上,如果保存了永久cookie的話,等于泄露了帳號(hào)。 所以,對(duì)于cookie的過期時(shí)間我們還需要權(quán)衡。

找回口令的功能

找回口令的功能一定要提供。 但是很多朋友并不知道怎么來設(shè)計(jì)這個(gè)功能。 我們有很多找回口令的設(shè)計(jì),下面我逐個(gè)點(diǎn)評(píng)一下。

  • 千萬不要使用安全問答。 事實(shí)證明,這個(gè)環(huán)節(jié)很煩人,而且用戶并不能很好的設(shè)置安全問答。 什么,我的生日啊,我母親的生日,等等。 因?yàn)榻裉斓幕ヂ?lián)網(wǎng)和以前不一樣了,因?yàn)镾NS,今天的互聯(lián)比以前更真實(shí)了, 我可以上facebook,開心,人人網(wǎng),LinkedIn查到你的很多的真實(shí)的信息。 通過這些信息我可以使用安全問答來重設(shè)你的口令。 這里需要說一下 Facebook,F(xiàn)acebook的安全問答很強(qiáng)大,還要你通過照片認(rèn)人,呵呵。

  • 不要重置用戶的密碼。 因?yàn)檫@有可能讓用戶的密碼遭到惡意攻擊。 當(dāng)然,你要發(fā)個(gè)郵件給用戶讓其確認(rèn),用戶點(diǎn)擊郵件中的一個(gè)鏈接,你再重置。 我并不推薦這樣的方法,因?yàn)橛脩粢话愣紩?huì)用筆記下來這個(gè)很難記的口令, 然后登錄系統(tǒng),因?yàn)榈卿浵到y(tǒng)時(shí)使用了“記住密碼”的功能,所以導(dǎo)致用戶不會(huì)去修改密碼, 從而要么導(dǎo)到被寫下來的密碼被人盜取,要么又忘記了密碼。

  • 好一點(diǎn)的做法——通過郵件自行重置。 當(dāng)用戶申請(qǐng)找回口令功能的時(shí)候,系統(tǒng)生成一個(gè)MD5唯一的隨機(jī)字串(可通過UID+IP+timestamp+隨機(jī)數(shù)), 放在數(shù)據(jù)庫(kù)中,然后設(shè)置上時(shí)限(比如1小時(shí)內(nèi)),給用戶發(fā)一個(gè)郵件, 這個(gè)連接中包含那個(gè)MD5的字串的鏈接,用戶通過點(diǎn)擊那個(gè)鏈接來自己重新設(shè)置新的口令。

  • 更好一點(diǎn)的做法——多重認(rèn)證。 比如:通過手機(jī)+郵件的方式讓用戶輸入驗(yàn)證碼。 手機(jī)+郵件可能還不把握,因?yàn)槭謾C(jī)要能會(huì)丟了,而我的手機(jī)可以訪問我的郵箱。 所以,使用U盾,SecureID(一個(gè)會(huì)變化的6位數(shù)token),或是通過人工的方式核實(shí)用戶身份。 當(dāng)然,這主要看你的系統(tǒng)的安全級(jí)別了。

口令探測(cè)防守

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

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

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

最后,再說一下,關(guān)于用戶登錄,使用第三方的 OAuth 和 OpenID 也不失為一個(gè)很不錯(cuò)的選擇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,087評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,207評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,603評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,813評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,364評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,110評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,305評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,532評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評(píng)論 1 291
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,033評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,268評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容