題:
“用戶名和/或密碼無效”-為什麼網站顯示這種消息而不是通知用戶哪個錯誤?
bobble14988
2012-07-30 13:40:00 UTC
view on stackexchange narkive permalink

讓我們說一個用戶正在登錄一個典型的站點,輸入用戶名和密碼,然後他們輸錯了其中一項輸入。我注意到,即使不是全部,大多數站點也會顯示相同的消息(類似“用戶名或密碼無效”)。

對我來說,這似乎很容易通知用戶哪個輸入錯誤,這讓我想知道為什麼網站不這樣做。那麼,是出於安全原因嗎?還是僅僅是一些已經成為常態的事情?

對於以不同方式查看用戶是否存在的網站,則不會獲得安全性提高。他們只是煩人。
Non security reason: If the database contains salted and hashed passwords, determining that the password matches an existing one would require hashing the password provided with every salt (1 per user, we hope) in the database.
一個與​​安全性完全不相關的原因是,提供程序可能不知道哪個錯誤。例如。如果bob1@provider.com將他的用戶名錯誤鍵入為bob2@provider.com,並且確實存在另一個用戶bob2@provider.com。
@MarkBeadles ...登錄實體將不知道用戶名是否有效?您可能需要再解釋一遍...
1. BOB1@PROVIDER.COM將id錯誤鍵入為“ BOB2@PROVIDER.COM”,並正確鍵入了他(自己的)密碼2。用戶BOB2存在於用戶store3中。登錄實體認為BOB2輸入了錯誤的密碼,而實際上BOB1輸入了用戶名。
I would agree that it is for security reasons. **I don't know any website where the username is supposed to be secret.** As an example: Google does the "Username and/or Password Invalid" thing but you can still find out if a username exists (by trying to register it).
AilirjdriaCMTãoPortela, but the creation screen is guarded by captcha. Thats the difference.
Occam的Razor說:程序員很懶。 :)
AilivxyzfxCMTãoPortela not all systems allow you to self-register automatically.
Because hackers can easily hack the accounts if they know any one thing correctly
AilitbuuixCMT fair point (I had forgotten about that). Still: your username is your email, which makes it very much public.
@Affe是的,但是您在帶有公共用戶名的系統中仍然看到此行為,其中“出於安全性考慮”的推理不適用。因此,肯定有另一個原因……也許僅僅是因為其他所有人都在這樣做。
Even if system allows to check if account exists in some other way, this would still slow down bruteforcing by amount of those requests.
@JoãoPortela,請考慮以下問題:如果gmail允許您確定是否存在沒有驗證碼的用戶ID,則他們將允許垃圾郵件發送者以一種方式來獲取合法的電子郵件帳戶。沒錯,如果在某些情況下用戶ID是完全公開的,那麼按照慣例很可能是這樣。為什麼您的網站代碼不支持這兩種情況?
AilirogugjCMT In the mean time I read [ExpectoPatronum](http://security.stackexchange.com/a/17857/2304) and similar ones and it makes a lot more sense. I just wasn't buying the whole: "after they know the username they just have to guess the password" thing.
AilihqeauoCMT In the case of Google, the captcha is there for signing up (like submitting the form), the validation is done via AJAX. You can see the URL, and the POST parameters, and the headers, so the hidden usernames are not the issue.
AilieuqzsdCMT The possibility of the user mistyping the username and submitting is extremely rare. Divide it by a billion and get the possibility of the mistyped username matching the one of another user. However, when the user base is huge (like Google's or Yahoo's) the possibility of this happening is higher. But even then, when bob1 mistypes bob2, without knowing he's actually bob1, the site could say "Password invalid for bob2" and the user will get the problem.
一些網站會在註冊時告訴您您提供的電子郵件地址是否已經存在於他們的系統中(有時會指向密碼重置功能)。任何人都可以闡明這是如何使惡意用戶無法找到有效用戶名的另一種方式嗎? (我不是在這裡僅在談論信息豐富的JavaScript提示等)
只是增加了更多:Facebook實際上會告訴您用戶名不存在的時間。 :)
Microsoft也是如此:“ *該Microsoft帳戶不存在。輸入其他電子郵件地址或獲取一個新帳戶。*” /“ *該密碼不正確。請確保您使用Microsoft帳戶的密碼。*”
十一 答案:
user10211
2012-07-30 13:44:08 UTC
view on stackexchange narkive permalink

如果惡意用戶通過猜測常見的用戶名/密碼組合(例如admin / admin)開始攻擊網站,則攻擊者將知道該用戶名有效,因為它返回的消息為“ Password invalid”(密碼無效),而不是“ Username or password invalid”(用戶名或密碼無效)

。如果攻擊者知道用戶名有效,則可以使用SQL注入或暴力破解密碼等技術將精力集中在該特定帳戶上。

Doesn't this assume that figuring out the username by other means is as difficult as guessing the password? As AilijzrwmbCMT points out, if you can validate the username by other means, it's really pointless to obfuscate it in this one interface.
AilikgafrpCMT Yes, it does assume that. But, that is not a bad assumption.
AilidgipmjCMT I think it's not uncommon that accounts that can be used to administer the website are not published in any publicly viewable username list.
@schroeder我不同意,對於最廣為人知的網站(gmail,facebook,twitter ...),用戶名非常公開。
Wouldn't it make sense for a website to state that every possible userid is valid and offer a made-up recovery email address as well? Would this help thwart malicious behavior by making hackers wast time on userids that in fact actually don't exist and have no passwords to crack?
@lazfish,但是您只需要顯示通常的“用戶名或密碼錯誤”消息並每天調用它,幾乎是一樣的。
@lazfish,否,因為任何智能用戶都可以分辨出那是假消息。我同意曼恩。
這實際上是同一件事,但也可以在對每個項目都進行驗證的環境中工作。
-1
他可以愚蠢地攻擊註冊頁面。
只是從另一個角度來看,假設黑客只對密碼進行暴力破解,因為有些人的密碼很弱。他會找到一個有效的密碼,該系統有1000個用戶,他編寫了一個簡單的腳本來從網站上抓取用戶名,然後他只需要嘗試所有用戶名,在這種情況下為1000次嘗試。由於攻擊者使用“最簡單”的密碼,因此此方法更快。
惡意用戶可以找出用戶名是否作為註冊的一部分。.您不允許兩個用戶使用相同的用戶名進行註冊。因此,模糊登錄失敗消息是沒有意義的。
@Gajus並非所有網站都提供註冊表。在某些SaaS網站中,管理員需要添加用戶。
ROFLwTIME
2012-07-30 18:12:28 UTC
view on stackexchange narkive permalink

就像其他人提到的那樣,我們不希望您知道用戶名或密碼是否錯誤,以免我們受到強力字典攻擊。

如果某些網站希望讓用戶知道哪一個失敗了,同時仍處於綠色安全狀態,則可以實施“ 蜜罐”用戶名(例如管理員,管理員等),將提醒網站管理員有人正在窺探他們的網站。如果他們試圖使用那些“ honeypot”用戶名之一登錄,甚至可以設置一些邏輯來禁止其IP地址。我知道一個人實際上擁有一個網站,並在其源代碼中添加了HTML註釋,例如“由於您一直忘記Richard:用戶名:cheese密碼:Burger123”之類的HTML註釋,目的是監視任何試圖使用的IP地址該用戶名/密碼。在開發網站時,添加這樣的監視邏輯非常有趣。

當然,記錄無效的登錄嘗試並添加適當的邏輯來處理這些IP地址也可以。我知道有些人會不同意我的觀點,但是根據網站的類型,我認為只要您添加了防止各種類型攻擊的附加安全措施,讓用戶知道就不會有太大的麻煩。

I love the idea of the coded false username/password to more quickly identify hacking IP addresses.
+1提到蜜罐用戶名,儘管您應絕對確保合法用戶不能創建與蜜罐同名的帳戶!
h一些合法用戶出於正當理由可能會查看html代碼(表單是如何實現的;或者是圖片?);並且要認真頁面中有密碼,請嘗試一下。
我看不出第二段和第三段相對於所提問題的價值。
dr jimbob
2012-07-31 00:48:25 UTC
view on stackexchange narkive permalink

我最喜歡的安全實現是由我使用的銀行完成的。如果我正確輸入用戶名,它將顯示“ Welcome Jimbob!”。然後提示我回答安全問題(如果我從未從此計算機上的瀏覽器登錄過),請等待我正確回答安全問題,然後讓我查看安全圖像/標題並輸入密碼。如果輸入錯誤的用戶名,將會看到類似“ Welcome Bessie / Kareem / Randal!”的字樣。其中顯示的名稱非常少見-儘管對於相同的用戶名,您將始終使用相同的名稱(我通常不確定一兩個用戶名之間;錯誤的名稱始終稱我為Frenshelia)。我假定其實現為對輸入的任何用戶名的某種非加密哈希,該用戶名唯一地映射到一長串相當不常見的名稱上的一個用戶名。這可以讓合法用戶知道他們是否輸入了錯誤的用戶名(即使您使用的是不常見的名稱(例如Bessie);您隨機猜到的錯誤的用戶名也不太可能映射回您的特定的不常見名稱),而不會使嘗試使用此方法的人看到查找用戶名不存在的隨機帳戶。

順便說一句:我並不特別喜歡安全問題/安全圖像部分,該部分似乎與安全劇院接壤。進行中間人(MITM)攻擊的老練攻擊者(例如,在您的Web瀏覽器中安裝了偽證書之後;並且DNS / ARP欺騙將yourbank.com指向其IP地址)可能會等到您嘗試登錄進入站點,然後在其計算機上將自動腳本登錄到實際站點,獲取安全問題,將選擇的安全問題顯示給您,然後從其瀏覽器將答案自動發送回站點,等待獲取安全性映像,將安全映像發回給您,然後等待您從其末端輸入密碼,此時他們將使用該密碼以您的身份登錄並執行惡意操作。授予問題+圖像比通過花費大量時間將攻擊轉變為必須實時進行並可能留下可疑簽名的攻擊來使過程變得更加困難。

是的,但是如果他們不這樣做,黑客應該如何在不需要密碼的情況下進入人們的其他帳戶? (這些安全性問題也困擾著我-尤其是在從列表中強制執行這些安全性問題時,回答這些問題不僅會發送鏈接。現在,一個不知道該用戶最喜歡的三年級學生的人確實可以,而且由於某些管理員是白痴,因此這些信息比完全安全的密碼有用得多……)
有時,密碼會通過網絡散列。服務器發送一個鹽,您將密碼與鹽結合在一起,然後對它進行哈希處理,然後將哈希發送到服務器。攻擊者可以訪問該特定會話,但他將不知道您以後的會話的密碼。如果有一個聰明的計劃,我很想听聽。
Dyppl
2012-07-31 00:54:17 UTC
view on stackexchange narkive permalink

其他答案可以很好地了解此行為背後的安全原因。儘管它們是正確的,但我敢肯定,至少一些網站只是對授權例程進行了編程,無法以某種方式分辨出錯誤的原因-登錄名或密碼。

示例查詢:

 從用戶那裡選擇COUNT(*),其中login ='john'AND hash ='2bbfcdf3f09ae8d700402f36913515cd' 

這將返回 1 成功登錄嘗試,如果沒有名稱的用戶,則輸入 0 。該用戶使用不同的密碼。無法確定條件的哪一部分失敗。因此,當顯示錯誤消息時,程序員會誠實地告訴您出了點問題,他不確定那到底是什麼。

我個人在少數基於PHP的網站中看到過類似的查詢,我可以肯定,部分原因確實來自身份驗證過程的編碼方式。

I have made login prompts that responded with the phrase for this exact reason!
-1
And to continue kba's point, using the same salt on all values, sometimes called a pepper is basically equivalent to using no salt at all; as all accounts can be attacked in parallel. Furthermore, you always should be careful to do constant time comparison of strings, which SQL will not do; even if they are hashed (especially if the hashing is being done client-side). Otherwise timing attacks can be used.
Yes, but this has been in school projects and hobby projects, so no need to worry :)
Just to be clear, I'm saying that this practice exists. Of course it is a bad one.
@kba如果您的查詢類似於:“從用戶中選擇COUNT(*),其中用戶名='_USER_'並且哈希= HASHFUNC(_PEPPER_ + _PASSWORD_ + salt);”。這不是一個完全合法的查詢,不會讓您知道哪個錯誤嗎?
AiliwvyamkCMT it would, but it requires hashing functions to be built in the particular SQL dialect
我認為這是在* /模糊登錄錯誤的實現/共識之後。我不認為這個雞蛋早於那隻雞。一些開發人員在這裡偷工減料,因為他們知道不需要(也不應該)告訴用戶是錯誤的電子郵件還是密碼。
Charlie Rudenstål
2012-07-31 04:36:44 UTC
view on stackexchange narkive permalink

但是,還有另一種有趣的技術可以應用於執行用戶枚舉攻擊(以及更多)。這稱為定時攻擊。攻擊者只需衡量身份驗證請求的響應時間以及有效和無效登錄之間的區別。

  1. PHP應用程序的納秒級遠程計時攻擊:認真對待它們的時間?
    http://blog.astrumfutura.com/2010/10/nanosecond-scale-remote-timing-attacks-on-php-applications-time-to-take-them-seriously/

  2. 定時攻擊課程
    http://codahale.com/a-lesson-in-timing-attacks/

  3. PHP中的恆定時間字符串比較可防止定時攻擊
    https://codereview.stackexchange.com/questions/13512/constant-time-string-我的觀點是,如果您想保護自己的應用程序免受攻擊,那麼這樣的消息是不夠的。這種威脅。

Lucas Kauffman
2012-07-30 13:42:53 UTC
view on stackexchange narkive permalink

其背後的安全原因是,找到有效的用戶名變得容易得多。

StasM
2012-07-31 04:41:44 UTC
view on stackexchange narkive permalink

除了已經給出的所有出色答案之外,還有一個通用的安全原則,該原則規定您不應向未經授權的用戶提供未經請求的信息。即如果您選擇回答“您的身份驗證數據無效”或說明哪一部分無效-您應該始終選擇前者。一些非常討厭的密碼攻擊是基於實施過程中提供的最微小的錯誤信息來實現的,這些錯誤信息試圖是“有幫助的”-請參見填充oracle攻擊。因此,始終選擇洩露給未授權實體的盡可能少的信息是一個好主意-即,如果他的用戶名/密碼組合不好,您總是回答“用戶名/密碼不好”,並且從不透露任何信息數據。即使在特定情況下(例如gmail,其中用戶名是公用的)也不重要,但默認情況下採用也是一種好習慣。

aayush anand
2012-07-30 19:20:02 UTC
view on stackexchange narkive permalink

假設您輸入了一個隨機的用戶名和一個同樣隨機的密碼(請注意輸入的密碼)。現在,密碼可以在n個用戶之間通用。因此,如果網站說密碼是正確的...那麼您就會知道接下來的事情..真正的用戶之間混亂不堪,因為獲取登錄名非常容易。

Jakub Šturc
2012-07-31 00:02:37 UTC
view on stackexchange narkive permalink

提供模棱兩可的答案對於防止用戶枚舉攻擊很有用。

在某些情況下,攻擊者無需破壞用戶帳戶。用戶擁有帳戶的信息就足夠了,無需任何其他操作。例如,客戶在競爭性的網上商店中擁有帳戶對於商業而言是有價值的信息。

Niks
2012-07-31 04:31:25 UTC
view on stackexchange narkive permalink

我很欣賞上面的各種回答,因為它們講得最多,但有時應用程序也不知道用戶名或密碼有誤。在基於令牌的身份驗證的情況下,專門用於實現SSO(單點登錄),例如 IBM Tivoli Access Manager您的應用程序會收到成功的令牌或返回錯誤。

Verena Haunschmid
2012-07-31 00:22:43 UTC
view on stackexchange narkive permalink

如果登錄名是電子郵件地址,則很容易發現某人已在網站上註冊-我可能不希望這樣做>>有時,當人們使用電子郵件ID作為登錄名時,他們會使用他們註冊網站的電子郵件帳戶真實密碼id:)



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...