假设用户登录到典型站点,输入用户名和密码,然后输入了错误的输入。我注意到,即使只有一个输入错误,大多数(即使不是全部)网站也会显示相同的消息(类似“用户名或密码无效”)。

对我来说,这似乎很容易足以通知用户错误的输入,这让我想知道为什么网站不这样做。因此,这是否有安全原因,或者仅仅是已经成为常态的事情?

评论

对于以不同方式查看用户是否存在的网站,则不会获得安全性提高。他们只是烦人。

一个与安全性完全不相关的原因是,提供程序可能不知道哪个错误。例如。如果bob1@provider.com的用户名错误输入为bob2@provider.com,而确实还有另一个用户bob2@provider.com。

1. BOB1@PROVIDER.COM错误地将id键入为“ BOB2@PROVIDER.COM”,并正确键入了他(自己的)密码。2.用户BOB2存在于用户存储区中3.登录实体认为BOB2错误地键入了他的密码,而实际上是BOB1输入了错误的用户名。

我同意这是出于安全原因。我不知道该用户名应该保密的任何网站。例如:Google做“用户名和/或密码无效”操作,但是您仍然可以找到用户名是否存在(通过尝试注册)。

@JoãoPortela,但创建屏幕由验证码保护。那就是区别。

#1 楼

如果恶意用户通过猜测常见的用户名/密码组合(例如admin / admin)开始攻击网站,则攻击者将知道用户名有效,因为它返回的消息为“ Password invalid”(密码无效),而不是“ Username or password invalid(用户名或密码无效)”。 />
如果攻击者知道用户名有效,他可以使用SQL注入或暴力破解密码等技术将精力集中在该特定帐户上。

评论


这不是假设通过其他方式找出用户名和猜测密码一样困难吗?正如@CodesInChaos指出的那样,如果您可以通过其他方式验证用户名,则在此界面中对其进行混淆实际上是没有意义的。

– kojiro
2012年7月30日12:55

网站声明每个可能的用户ID均有效并提供虚假的恢复电子邮件地址是否合理?这会否通过使黑客将时间浪费在实际上实际上不存在并且没有密码可破解的用户名上,从而帮助阻止恶意行为?

– Gooddadmike
2012年7月30日19:11



@lazfish,但随后您可以显示通常的“用户名或密码错误”消息,然后将其命名为一天,这几乎是相同的。

–马恩
2012年7月30日在20:12

他可以愚蠢地攻击注册页面。

–萨尔曼·冯·阿巴斯
2012年7月31日在1:25

恶意用户可以找出用户名是否作为注册的一部分。.您不允许两个用户使用相同的用户名进行注册。因此,模糊登录失败消息是没有意义的。

–加雷斯
2014年9月9日在21:46

#2 楼

正如其他人所提到的,我们不希望您知道用户名或密码是否错误,以免受到暴力破解或字典攻击的影响。.

如果一些网站希望让用户知道哪一个失败,同时仍处于绿色安全状态,因此他们可以实施“蜜罐”用户名(例如Administrator,admin等),以警告网站管理员有人正在窥探他们的网站。如果他们试图使用那些“蜜罐”用户名之一登录,甚至可以设置一些逻辑来禁止其IP地址。我知道一个人实际上拥有一个网站,并在其源代码中添加了HTML注释,例如“由于您一直忘记Richard:用户名:Cheese密码:Burger123”,目的是监视试图使用的任何IP地址该用户名/密码。在开发网站时,添加这样的监视逻辑非常有趣。

当然,记录无效的登录尝试并添加适当的逻辑来处理这些IP地址也可以。我知道有些人会不同意我的观点,但是根据网站的类型,我认为只要您添加了防止各种类型攻击的附加安全措施,让用户知道就不会太麻烦。

评论


我喜欢编码错误的用户名/密码以更快地识别黑客入侵IP地址的想法。

–大卫·纳瓦拉(David Navarre)
2012年7月30日14:06

+1提到蜜罐用户名,尽管您应绝对确保合法用户不能创建与蜜罐同名的帐户!

–摩西
2012年7月31日0:00

h一些合法用户出于正当理由可能会查看html代码(表单是如何实现的;或者是图片?);并且要认真页面中有密码,请尝试一下。

– jimbob博士
2012年7月31日下午4:14

我看不出第二段和第三段相对于所提问题的价值。

–亚当·林奇(Adam Lynch)
2012年8月1日在11:24

#3 楼

我最喜欢的安全实现是由我使用的银行完成的。如果我正确输入用户名,它将显示“ Welcome Jimbob!”。然后提示我回答安全性问题(如果我从未从此计算机上的浏览器登录过),请等待我正确回答安全性问题,然后让我查看安全性图像/标题并输入密码。如果输入错误的用户名,则会看到类似“ Welcome Bessie / Kareem / Randal!”的字样。其中显示的名称非常少见-尽管对于相同的用户名,您将始终使用相同的名称(通常我不确定一两个用户名之间;错误的用户始终称我为Frenshelia)。我假设其实现为对输入的任何用户名的某种非加密哈希,这些哈希唯一地映射到一长串相当不常见的名称上的一个用户名。这可以让合法用户知道他们是否输入了错误的用户名(即使您使用的是不常见的名称(例如Bessie);您随机猜到的错误的用户名也不太可能映射回您的特定的不常见名称),而不会使尝试使用此功能的用户显而易见查找用户名不存在的随机帐户。

顺便说一句:我不是特别喜欢安全问题/安全图像部分,它似乎与安全剧院接壤。进行中间人(MITM)攻击的老练攻击者(例如,在您的Web浏览器中安装了伪证书之后;并且DNS / ARP欺骗将yourbank.com指向其IP地址)可能会等到您尝试登录进入站点,然后在其计算机上将自动脚本登录到实际站点,获取安全问题,将选择的安全问题显示给您,然后从其浏览器将答案自动发送回站点,等待获取安全性映像,将安全映像发回给您,然后等待您从其末端输入密码,此时他们将使用该密码以您的身份登录并执行恶意操作。授予问题+图像比将世界上的所有时间都转变为必须实时进行并可能留下可疑签名的攻击要困难得多,这要比世界上所有时间都要收集各种受攻击用户名的所有安全图像要困难得多。 。

评论


是的,但是如果他们不这样做,黑客应该如何在不需要密码的情况下进入人们的其他帐户? (这些安全性问题也困扰着我-尤其是在从列表中强制执行这些安全性问题时,回答这些问题不仅会发送链接。现在,一个不知道该用户最喜欢的三年级学生的人确实可以,而且由于某些管理员是白痴,因此这些信息比完全安全的密码有用得多……)

– root
13年3月28日在3:38

有时,密码会通过网络散列。服务器发送一个盐,您将密码与盐结合在一起,然后对它进行哈希处理,然后将您的哈希发送到服务器。攻击者可以访问该特定会话,但他将不知道您以后的会话的密码。如果有一个聪明的计划,我很想听听。

– Hello World
14年6月11日在8:29

#4 楼

其他答案可以很好地了解此行为背后的安全原因。尽管它们是正确的,但我敢肯定,至少有些网站只是对授权例程进行了编程,无法通过某种方式来区分出什么错误-登录名或密码。
SELECT COUNT(*) FROM users WHERE login = 'john' AND hash = '2bbfcdf3f09ae8d700402f36913515cd'


成功登录后将返回1,如果没有使用该名称的用户或该用户使用不同的密码,则返回0。无法确定条件的哪一部分失败。因此,在显示错误消息时,程序员只是诚实地告诉您出了点问题,他不确定那到底是什么。我敢肯定,部分原因确实来自身份验证过程的编码方式。

评论


由于这个确切的原因,我已经做出了登录提示,并用了短语来回应!

– Monoceres
2012年7月30日23:49

@monoceres在这种情况下,您很可能做错了。您的密码不是固定的,或者都是相同的值。

–kba
2012年7月31日,0:14

并且为了延续kba的观点,在所有值上使用相同的盐(有时称为胡椒粉)基本上等效于完全不使用盐;因为所有帐户都可以并行攻击。此外,您应始终谨慎地对字符串进行恒定时间比较,而SQL则不会这样做。即使对它们进行了哈希处理(尤其是在客户端进行哈希处理的情况下)。否则,可以使用定时攻击。

– jimbob博士
2012年7月31日下午4:19

是的,但这是在学校项目和业余项目中,因此无需担心:)

– Monoceres
2012年7月31日在16:05

我认为这是在模棱两可的登录错误的实现/共识之后。我不认为这个鸡蛋早于那只鸡。一些开发人员在这里偷工减料是因为他们知道不需要(也不应该)告诉用户是错误的电子邮件还是密码。

–亚当·林奇(Adam Lynch)
2012年8月1日在11:28

#5 楼

但是,还有另一种有趣的技术可以应用于执行user enumeration attack(以及更多)。它称为Timing attack。攻击者只需测量身份验证请求的响应时间,以及有效和无效登录之间的区别。 http://blog.astrumfutura.com/2010/10/nanosecond-scale-remote-timing-attacks-on-php-applications-time-to-take-them-seriously/
有关定时攻击的课程http ://codahale.com/a-lesson-in-timing-attacks/
PHP中的恒定时间字符串比较可防止定时攻击https://codereview.stackexchange.com/questions/13512/constant-time-string -comparision-in-php-to-prevent-timing-attacks

我的观点是,如果您想保护您的应用程序免受这种威胁,这样的消息是不够的。

#6 楼

背后的安全原因是,否则找到有效的用户名变得容易得多。

#7 楼

除了已经给出的所有出色答案之外,还有一条通用的安全原则,该原则规定您不应向未经授权的用户提供未经请求的信息。即如果您选择回答“您的身份验证数据无效”或说明哪一部分无效-您应该始终选择前者。一些非常讨厌的密码攻击是基于实施尝试提供的最小的错误信息而来的,这些错误信息是“有帮助的”-请参阅填充Oracle攻击。因此,始终选择泄露给未授权实体的尽可能少的信息是一个好主意-即,如果他的用户名/密码组合不好,您总是回答“用户名/密码不好”,并且从不透露任何信息数据。即使在特定情况下(例如gmail,其中用户名是公共的)也并不重要,但默认情况下采用也是一种好习惯。

#8 楼

假设您输入了一个随机的用户名和一个同样随机的密码(请注意输入的密码)。现在,密码可以在n个用户之间通用。因此,如果网站说密码是正确的...那么您就会知道接下来会发生什么..真正的用户之间混乱不堪,因为获取登录名非常容易。

#9 楼

提供模棱两可的答案有助于防止用户枚举攻击。

在某些情况下,攻击者无需破坏用户帐户。用户拥有帐户的信息就足够了,无需任何其他操作。例如,客户在竞争性的网上商店中拥有帐户对于商业而言是有价值的信息。

#10 楼

我最欣赏上面提到的各种答案,但有时应用程序也不知道用户名或密码有误。在基于令牌的身份验证的情况下,专门用于实现SSO(单点登录),例如IBM Tivoli Access Manager,您的应用程序会收到成功的令牌或返回错误。

#11 楼

如果登录名是电子邮件地址,则很容易发现有人在网站上注册-我可能不希望>>有时,当人们使用电子邮件ID作为登录ID时,他们使用电子邮件帐户的真实密码注册网站:)