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中。我看到太多的站點這麼幹了。
正確設計「記住密碼」。這個功能簡直就是乙個安全隱患,我覺得並不是所有的程式設計師都知道怎麼設計這個事。下面是一些方法供你參考。
1)在cookie中,儲存三個東西——使用者名稱,登入序列,登入token。
使用者名稱:明文存放。
登入序列:乙個被md5加密過的隨機數,每次以輸入口令的方式登入後更新。
登入token:乙個被md5加密過的隨機數,僅乙個登入session內有效,新的登入session會更新它。
2)上述三個東西會存在伺服器上,伺服器的驗證使用者需要驗證客戶端cookie裡的這三個事。
3)為什麼要設計這個樣子?因為,
a)登入token是單例項登入。意思就是乙個使用者只能有乙個例項。
b)登入序列是用來做盜用行為檢測的。如果使用者的cookie被盜後,盜用者使用這個cookie訪問**時,我們的系統是以為是合法使用者,然後更新「登入token」,而真正的使用者訪問時系統發現,只有「使用者名稱」和「登入序列」相同,但是「登入token」不對,這樣的話,系統就知道,這個使用者出現了被盜用的情況,於是,系統可以清除登入序列和登入token,這樣就可以令所有的cookie失效,並要求使用者輸入口令。並給警告使用者系統安全。
1)修改口令。
2)修改電子郵件。(電子郵件通過用來找回使用者密碼)
3)使用者的隱私資訊。
4)使用者消費功能。
找回口令的功能
找回口令的功能一定要提供。但是很多朋友並不知道怎麼來設計這個功能。我們有很多找回口令的設計,下面我逐個點評一下。
千萬不要使用安全問答。事實證明,這個環節很煩人,而且使用者並不能很好的設定安全問答。什麼,我的生日啊,我母親的生日,等等。因為今天的網際網路和以前不一樣了,因為sns,今天的互聯比以前更真實了,我可以上facebook,開心,人人網,linkedin 查到你的很多的真實的資訊。通過這些資訊我可以使用安全問答來重設你的口令。facebook的安全問答很強大,還要你通過**認人。
不要重置使用者的密碼。因為這有可能讓使用者的密碼遭到惡意攻擊。當然,你要發個郵件給使用者讓其確認,使用者點選郵件中的乙個鏈結,你再重置。我並不推薦這樣的方法,因為使用者一般都會用筆記下來這個很記的口令,然後登入系統,因為登入系統時使用了「記住密碼」的功能,所以導致使用者不會去修改密碼,從而要麼導到被寫下來的密碼被人盜取,要麼又忘記了密碼。
好一點的做法——通過郵件自行重置。當使用者申請找回口令功能的時候,系統生成乙個md5唯一的隨機字串(可通過uid+ip+timestamp+隨機數),放在資料庫中,然後設定上時限(比如1小時內),給使用者發乙個郵件,這個連線中包含那個md5的字串的鏈結,使用者通過點選那個鏈結來自己重新設定新的口令。
更好一點的做法——多重認證。比如:通過手機+郵件的方式讓使用者輸入驗證碼。手機+郵件可能還不把握,因為手機要能會丟了,而我的手機可以訪問我的郵箱。所以,使用u盾,secureid,或是通過人工的方式核實使用者身份。當然,這主要看你的系統的安全級別了。
口令探測防守
使用驗證碼。驗證碼是後台隨機產生的乙個短暫的驗證碼,這個驗證碼一般是乙個計算機很難識別的。這樣就可以防止以程式的方式來嘗試使用者的口令。事實證明,這是最簡單也最有效的方式。當然,總是讓使用者輸入那些肉眼都看不清的驗證碼的使用者體驗不好,所以,可以折中一下。比如google,當他發現乙個ip位址發出大量的搜尋後,其會要求你輸入驗證碼。當他發現同乙個ip註冊了3個以上的gmail郵箱後,他需要給你發簡訊方式或是**方式的驗證碼。
使用者口令失敗次數。調置口令失敗的上限,如果失敗過多,則把帳號鎖了,需要使用者以找回口令的方式來重新啟用帳號。但是,這個功能可能會被惡意人使用。最好的方法是,增加其嘗試的時間成本(以前的這篇文章說過乙個增加時間成本的解密演算法)。如,兩次口令嘗試的間隔是5秒鐘。三次以上錯誤,帳號被臨時鎖上30秒,5次以上帳號被鎖1分鐘,10次以上錯誤帳號被鎖4小時……
系統全域性防守。上述的防守只針對某乙個別使用者。惡意者們深知這一點,所以,他們一般會動用「殭屍網路」輪著嘗試一堆使用者的口令,所以上述的那種方法可能還不夠好。我們需要在系統全域性域上監控所有的口令失敗的次數。當然,這個需要我們平時沒有受到攻擊時的資料做為支援。比如你的系統,平均每天有5000次的口令錯誤的事件,那麼你可以認為,當口令錯誤大幅超過這個數後,而且時間相對集中,就說明有黑客攻擊。這個時候你怎麼辦?一般最常見使用的方法是讓所有的使用者輸錯口令後再次嘗試的時間成本增加。
3 5年的產品狗,你會做產品規劃嗎?
我認為3 5年的產品不論是不是做到產品負責人,都應該要對自己的產品發展有乙個較為清晰的規劃思路。今天就結合自己的工作經驗來談談如何做產品規劃。由面試引發的思考最近我在給部門面試產品經理,大概面試了30來位3 5年產品經理的候選人。當問到這個問題 你做為產品經理或產品線負責人,是如何規劃未來3 6個月...
你的登入介面真的安全嗎?
大家學寫程式時,第一行 都是hello world。但是當你開始學習web後台技術時,很多人的第乙個功能就是寫的登入 小聲 別人我不知道,反正我是 但是我在和很多任務作經驗較短的同學面試或溝通的時候,發現很多同學雖然都有在簡歷上寫 負責專案的登入 註冊功能模組的開發和設計工作,但是都只是簡單的實現了...
單關閉功能 你見過帶報警功能的路燈嗎?
初時的馬路電燈在每根電線桿上裝閘刀開關,需工人每天開啟關閉。3年後,改用若干路燈合用乙個開關,這種形式的路燈在全國各城市中一直沿用到20世紀50年代。路燈很多種 高桿燈 中杆燈 道路燈 庭院燈 草坪燈 地埋燈,但是你見過帶安防報警功能的路燈嗎?將 雷射入侵探測器 與 景觀燈 巧妙結合,使得路燈在照明...