為什麼很多網站登錄失敗只提示「登錄失敗」或「帳號或密碼錯誤」,而沒有更詳細說明到底是賬號還是密碼錯誤?
只有少數網站是指出到底是帳號不存在還是密碼錯誤。事實上,我經常不知道是否在某個網站註冊了,如果提示帳號不存在,我就不會浪費時間去想密碼了。
除了 @羅晟 說的效率的問題,還有隱私、安全的考慮。
你說道『如果提示帳號不存在,我就不會浪費時間去想密碼了』,這個就是安全隱患:你會這樣想,入侵你帳號的人也會這樣想。
在互聯網的早期,網站的登陸並沒有像現在一樣具備複雜的防機器人(bots)自動登陸的功能。如果明確提示是帳號還是密碼有誤,惡意用戶可以通過反覆嘗試的方法猜到組合。比如很多網站都是使用郵箱地址作為帳號,而郵箱地址又是公開的。可以輸入你要入侵的對象的可能郵箱地址來檢查他是否使用某個網站,加上大多數小白用戶的密碼都不是很複雜,機器人很快就能夠試出密碼。如果網站不明確提示是用戶名還是密碼錯誤,則引入了一點不確定因素,因為有可能你試的那個帳號並不存在。
現在隨著機器人使用的普及,多數網站的安全防範都加入了防機器人程序暴力入侵的措施(各種各樣的圖靈測試),因此之前的安全考慮不那麼要緊了,但隱私仍然是個問題。有時候你並不想別人知道你在用比如 http://www.youporn.com 之類的網站對吧?
模糊提示是好的,能有效提高暴力破解的門檻。
個人認為「偷懶」、「效率」和「安全」都不是主要原因,慣例才是真正原因。
「偷懶」與「效率」的因素:
其實區分賬號不存在與密碼錯誤的情況只需要一次資料庫查詢。考慮如下流程:
其中紅色步驟為查詢操作,藍色為匹配結果的三種狀態。
效率有降低嗎?我覺得沒有。
更複雜了嗎?多5行左右的代碼量,我覺得沒有。
"安全"因素:
如果放在若干年前,可能還有一定程度上防止暴力猜解的因素,但是現在幾乎所有網站在註冊時都提供賬號存在檢測功能,而且不需要驗證碼!這功能完全可以用來猜測賬號是否存在!
所以,個人覺得真正的原因是「行業慣例」。
為什麼這麼說,因為上面的流程圖就是我在剛入職時做用戶登錄認證時的方法。可能是因為半路出家沒有接觸到很多「行業慣例」,因此這個流程是我自己琢磨的。後來被項目經理看到,還專門講了講:他做了那麼多年開發,一直都是使用username與password同時匹配查詢的,也從來沒有想過其它的,因為「大家都這麼做」。
==================================================
說句跑題的。
web頁面也好,客戶端圖形、命令行界面也好,本質上都是視圖,提供人機交互的作用。
用戶名/密碼驗這種身份認證方法用了幾十年,到現在也沒變出什麼新花樣,最主要的原因,應該還是交互設備的問題。滑鼠鍵盤是最基本的標配,其它的輸入設備無法保證,自然也就無法使用別的認證方法了。
目前還是有一些積極改變的想法,但是效果不大。比如x想筆記本以前大力宣傳的面部識別系統登錄,android系統的面部識別解鎖等,這都是實實在在的另一種身份認證方法啊,可是因為識別率不足、速度慢等(我覺得還有一個很重要的就是因為獃獃地瞪著筆記本太傻逼!)原因都沒有被用戶接受。
這個當然是從安全考慮的,每次遇到這種問題,我會試試註冊,看用戶名是否已經被使用。
主要還是怕被把帳號猜解出來。
因為你提示密碼錯誤,那不就是告訴黑客,該帳號存在,只是密碼輸入錯誤了嗎?(雖然現在可以通過註冊檢驗的方式來猜解帳號)
一方面你可以認為是程序員偷懶……另一方面,從程序的角度上看,驗證一個帳號實際上是去資料庫中查詢用戶名 + 密碼的組合是否存在——通常這隻需一個步驟。如果變成先判斷用戶名是否存在,再判斷用戶名存在的情況下密碼是否符合就變成兩個步驟了。如果把問題變複雜化的意義不是特別大的話當然是能省一步就省一步了。
從用戶體驗角度來說,登錄時,提示用戶名是否存在或者密碼不正確,是用戶友好的;
但從安全性角度來看,一旦告知得太完善,比如系統提示「密碼輸入錯誤」,可能會給hacker留下利用窮舉法,找到密碼的機會。所以從這個角度來說,提示得模糊點,是有必要的。
個人覺得 @羅晟 說的其實就是真相了。
關於此問題我曾經跟程序員討論過,其實就是為了省事——查詢資料庫一次還是兩次對他們來講有一個開發量的問題,他們自然希望能夠省點兒時間。
因為你無法知道用戶究竟是打錯賬號了,還是輸錯密碼了?
正確的提示應該是:賬號與密碼不匹配!
如果不考慮安全性,用戶名不存在的時候就提示不存在~
安全問題不是理由。應該明確告知用戶此帳戶是否存在。至於窮舉法破解不用擔心,可以使用驗證碼和限制重複錯誤登錄次數防範此類攻擊。
我說一下為什麼我會這麼做
1、有的網站是這樣的,所以借鑒一下
2、可以少做一些處理,懶
3、在某些角度還能提高安全性,可以用來忽悠領導和客戶
恩,我記得以前看過這個問題啊,總體記得不太清楚了,但核心還記得就是:首先,密碼這個東西是個很隨意的東西,所以很多人都是一樣的密碼(PS:123456的說)就導致了一種可能就是我只根據密碼來試帳號也有那麼一點點的可能被我瞎貓碰到死耗子碰一個那我就賺了。其次就是可以減輕系統的工作,因為一個帳號對應一個密碼就像是一套的,系統只需要驗證你給的這一套就夠了,而不需要拆開來還去驗證帳號和密碼,所以要麼正確你給的一套是符合的就順利登入,要麼不正確系統沒有你給的一套(可能密碼錯也可能帳號不存在)就不能登入。大致就只記得這些了。
主要是為了安全考慮,並不是偷懶.
實際上他是為了讓看到的人獲得更少的信息量防止你的賬號或密碼泄露的,如果他光彈出密碼錯誤那麼攻擊者就會知道原來這個賬號是存在的。。。從而使攻擊者多知道了一點信息。。。
首先,從安全性考慮,網站應該做到模糊性,不然可能會導致被密碼機試出來,其次,我覺得,網頁錯誤提示,用戶名密碼等錯誤提示,是否可以做的更人性化,更親近使用者,方便使用者,添加笑話或其他內容,使用戶心情改善。
安全是關鍵,偷懶屬於附加值。呵呵
其實這個也看網站了,如果網站不顯示用戶名的,我一般只告知「用戶或是密碼錯誤」,而不會精確到是用戶名錯誤還是密碼錯碼
但是如果網站裡面有顯示用戶名的,我則會明確告訴他是用戶名不存在還是密碼錯了。。
其實都只是,為了.安全考慮而著想的...現在互聯網.這麼發達.每個人都建議有一個儲存帳號密碼的小保險箱 或者,自己註冊過什麼網站.帳號密碼.用本子記下來.切忌...請勿用同樣的帳號密碼.這樣對個人隱私泄漏是很危險的
主要是安全考慮。
從長遠來看,犧牲部分用戶體驗保證更多的安全是值得的。
剛好看到,本科在讀信息安全,做過一些web滲透,也自己開發過web應用。
這種模糊提示的目的應該就是安全,從實現來說,想把兩種錯誤分開幾乎只需要極少的時間,所以並不存在偷懶的說法。
說到安全,也就是窮舉的安全,假定用戶名和密碼各有10000種可能,我們分別計算被猜解的可能性。
第一種,對用戶名和密碼錯誤分別提示。考慮最壞的情況,第10000次猜中了用戶名,又用10000次猜中了密碼,一共需要10000+10000=20000次。
第二種,不會告訴你用戶名錯了還是密碼錯了。用戶名和密碼共有10000*10000=10000 0000中可能性,兩者完全不在一個數量級,是2n和n平方的差別。
實際的猜解空間會更大,用於破解的差別也就差的更加離譜了。
一樓說的是撞庫攻擊,前幾天的12306就是個例子,我也用過類似的手段拿到學校免費的校園網帳號,總的來說不區分兩種錯誤是基本的安全意識。
至於造成的不便,可能會有更好的辦法吧,我是沒想出來。
知乎首答,有錯請指正。偷懶沒偷半點懶, 為了安全到是真的
推薦閱讀: