应该显示一条通用消息而是像“密码或用户名错误”之类。
原因是不向潜在攻击者显示已使用的用户名,因此更难“破解”现有帐户。
听起来对我来说很合理,但随后我想到了一些不同的东西。
注册帐户时,请输入用户名。当它已经被使用时,您会收到一条错误消息-这不是通用消息!
因此,基本上,攻击者可以从注册页面中获取“正确的”用户名,否则我错了吗?
那么,普通消息又有什么意义呢?非通用消息将导致更好的用户体验。
#1 楼
不,您是正确的,在防止攻击者确定有效用户身份的过程中,您要么必须对他们说谎,要么提供异常模糊的错误消息。您的应用可能会告诉用户“请求的用户名不可用”,而不是明确说明该用户名已被使用还是不满足您的其他用户名要求(长度,字符使用率,保留字等)。当然,如果这些详细信息是公开的,则攻击者可能会发现,由于帐户正在使用而不是由于格式无效而导致他们的猜测失败。
然后,您还拥有密码重置系统。您是否接受任何用户名/电子邮件地址,并说已发送了一条消息,即使该帐户不在您的数据库中?帐户锁定(如果您正在使用)怎么办?您是否只是告诉用户即使他们不是他们的凭据也是无效的,而是他们的帐户被锁定了,希望他们联系可以确定问题的客户支持?
攻击者很难收集有效的用户名,但这通常是使用户受挫的代价。我见过的大多数较低安全性站点都使用单独的消息来标识用户名或密码是否错误,原因仅在于它们偏爱使用户满意的一面。您必须确定您的安全要求是否决定优先考虑用户体验。
评论
如果该站点允许您选择用户名(没有与选择密码时相同的建议),那么开玩笑就可以对用户名保密。好的,一些用户将从保密性中受益,因为他们将选择难以猜测的用户名,但是无论您随后采取什么措施对其进行保密,用户“ dave”都不会获得这种利益;-)因此,几乎不是必不可少的。
–史蒂夫·杰索普(Steve Jessop)
2014年7月10日9:13
+1,表示...确定您的安全要求是否决定优先考虑用户体验
– karancan
14年7月14日在20:10
好吧,您可以将密码重置和帐户创建结合起来:任何可以创建的帐户确实存在,只是没有人知道密码。
–重复数据删除器
15-10-26在15:42
#2 楼
您假设系统实际上知道错误输入了哪个字段。有多种原因不一定是正确的。一种可能性是它是实现的副作用。在数据库中查找登录信息的一种简单方法可能类似于(使用
:n
作为用户提供的参数):SELECT 1
FROM users
WHERE username=:1 AND
password=HASHING_FUNCTION(CONCAT(:2, salt))
如果结果为空,则说明知道登录应该失败,但是除非您执行更复杂的操作或进行其他查询,否则您不知道为什么。因此,有时可能只是懒惰或希望在数据库上轻松自如,而不是有意识的安全决策。
但是即使实现可以区分不存在的用户和不正确的凭据,您仍然可以用户正确输入密码但用户名输入错误的情况,恰好是存在的用户(使用不同的密码)。然后,如果用户收到一条消息,说他们的密码不正确,那将是错误的。因此,除非指定的用户名不存在,否则系统实际上无法知道用户名或密码是否错误。
评论
没有安全意识的系统不应该使用这种身份验证,因为除了散列之外,您还需要添加盐。理想情况下,每排盐。因此,按名称查找,抓盐和哈希,然后进行比较。
– MaxSem
2014年7月8日在6:10
而且,我怀疑大多数DBMS是否实现了正确的HASHING_FUNCTION,而且我还怀疑这可能会受到定时攻击的影响。我不会那样做。
–莫尔梅吉尔
2014年7月8日13:00
特别是第二点非常好!如果用户的用户名中有错别字,但随机匹配另一个用户名,则正确消息将为“错误的用户名”,因为对于用户而言,它是错误的用户名,即使系统在数据库中找到了该用户名,因此通用用户名是总是更好! @Mormegil我认为代码是有效的,HASHING-FUNCTION当然应该是加密安全的哈希函数。但是计时不是问题,除非您知道由于快速索引扫描而导致用户名可能不在数据库中。但是如前所述,这可能与大多数现代应用程序无关
– Falco
2014年7月8日在13:58
@Falco好吧,HASHING-FUNCTION类似于SHA-256(可能在DBMS中实现),这是一种快速哈希,不适用于密码哈希,或者它类似于PBKDF或BCRYPT(可能未提供)通过当前的任何DBMS)和定时攻击都可以轻松地区分是否找到了用户名(密码错误)或未找到用户名。简而言之,我不知道为什么有人会想以这种方式实现它。 (第二点是有效的。)
–莫尔梅吉尔
2014年7月8日在17:45
@Mormegil PostgreSQL提供了bcrypt。它可能会受到定时攻击的影响,具体取决于您如何构造查询。
– jjanes
2014年7月10日下午5:52
#3 楼
通常,强行注册页面要比强行登录页面难,因此我们可以从这笔额外费用中受益。但是,从概念上讲,您是正确的。除了登录页面消息外,还有其他枚举用户名的方法。只是简单地将“ Good Practice”(TM)保持登录失败消息的通用性,以使攻击者更难从坏账中收集好账。使用暴力破解工具,尝试使用随机名称是很简单的,然后在错误消息更改时,开始使用暴力破解强制使用该用户名。
但是,与往常一样,您需要在可用性与减少威胁之间取得平衡。
评论
是的,这个。注册页面通常包含某种形式的验证码。
–domen
2014年7月8日在11:42
只要验证码或其他质询/拼图出现在用户被告知该名称已被使用之前。两次尝试之间还应有一个合理的等待时间,但不要长久不让试图建立真实账户的真实人望而却步。
–菲尔·佩里(Phil Perry)
2014年7月9日在17:02
#4 楼
并非所有系统都有帐户注册。例如,您的操作系统登录名不是。网站确实会不时停止接受新成员。这是一个关注点分离的问题:登录对话框是否应查询系统配置并根据系统是否配置为接受应用程序自定义其行为,新帐户吗?然后,将登录对话框与实际上与其工作无关的信息耦合。
在所有情况下仅实施模糊的错误消息似乎更加容易(假设UI软件甚至知道它是否是错误的消息)。密码错误或帐户不存在:如果它从某个较低级别的API中收到通用身份验证错误,该怎么办?)
此外,新用户应用程序UI可以实现长时间的假延迟例如“正在搜索用户群... [10秒] ...糟糕,用户名已被占用!”如果实现了该功能,则意味着通过此机制探测用户ID的空间受到严格的速率限制。由于申请新帐户是一种罕见的一次性操作,因此用户将遭受延迟,而在常规登录对话框中,由于十秒的延迟,他们会变得更加糟糕。
评论
+1表示限制(速率限制)。
– alexw
16-10-31在1:10
#5 楼
这取决于用户名。用户名的三种主要处理方法:用户选择的名称
电子邮件地址
分配的用户名-通常是一串数字
您是正确的,对于用户选择的名称,攻击者可以使用注册过程来推断正在使用的名称,因此,登录名返回通用消息的好处有限。
在两种情况下,登录屏幕返回通用错误消息更为重要。考虑一个招聘网站,让joe.bloggs@abc.com的老板发现招聘网站上有一个帐户,可能会很尴尬。分配的用户名最常用于在线银行等高安全性站点。
评论
对于电子邮件地址,您假设当您去注册一个新帐户并提供一个现有的电子邮件地址时,它不会立即给您显示“电子邮件地址已在使用中”错误。否则,如果它在注册屏幕上显示出来,那么避免在登录屏幕上显示出来没有太大的好处。避免这种情况的一种方法是,在告诉您提供的电子邮件地址是否已被使用之前,注册屏幕需要输入验证码。
– D.W.
2014年7月9日在22:07
@ D.W。 -可以,或者您可以先发送确认码到电子邮件地址,而无需验证码,只需确认一次即可通知用户该地址是否已被使用。
–paj28
2014年7月10日在7:43
#6 楼
是的,你是对的。您网站上可以确认用户名存在或不存在的任何地方都可能导致用户名枚举。但是,如果此问题对您的系统很重要,则可以解决。在某些系统中,无法避免用户名枚举,因为它是应用程序本质所固有的。一个示例是网络邮件服务-在此电子邮件地址被视为潜在的公开地址。在不要求用户使用与其托管电子邮件地址不同的标识符登录的情况下,很难阻止用户知道其他用户名,这可能导致混乱和恢复丢失的凭据的困难。
但是,对于大多数其他系统可以通过将用户的电子邮件地址作为其登录用户名来解决此问题。您可以通过将忘记的密码和注册表单有效地设置在同一页面上来解决该问题。要进行注册,这将是一个多步骤表单,第一步只是询问用户希望用于系统的用户名(电子邮件)。对于帐户恢复,这将是相同的表格,但是标题将使用
Please enter your email address to generate a password recovery email
这样的文字。在两种情况下,该表格都会向用户发送电子邮件。如果已经注册,则此电子邮件的内容包含密码重置链接。如果未注册,则此电子邮件的内容将包含指向注册过程下一阶段的链接。这将防止枚举系统上的用户名,因此攻击者将不知道要定位的帐户。
当然,这意味着您愿意允许通过电子邮件重设密码,这对于某些人来说可能是不可接受的。银行应用程序之类的应用程序。但是,由于这类帐户通常需要进行额外的安全检查,因此通常会为银行分配用户名,而不是允许人们自行选择用户名。
#7 楼
模糊消息的常见论点似乎是防止攻击者猜测有效的用户名。实际上,有一个简单的解决方案不会严重影响合法用户,因此无论如何都应采用:限制一段时间内尝试失败的最大次数。通过限制尝试,可以防止所有暴力行为力攻击。假设您每15分钟仅允许5次尝试(在论坛中很常见),这会使猜测用户名的攻击几乎毫无用处。它还可以防止强行使用密码(因为无论如何它都像在远程站点上那样缓慢,所以速度很慢)。
当然,攻击者可能已经拥有用户名数据库,只希望检查用户名是否存在于您的网站上。并且您需要考虑其安全性,但是通常它们要么已经具有密码(使讨论变得毫无意义),要么就没有(因此受限制的尝试无论如何都会阻止猜测)。
评论
我认为在类似论坛的事情上,简单地抓取现有的公开帖子以发现用户名而不是尝试强行使用它们会更快。一些论坛软件甚至包括一个页面,该页面为您列举了用户名!
– Brian S
2014年7月9日19:26
#8 楼
一个智能网站的注册页面上会有一个验证码,以防止发生这种情况。但是您知道99%的网站的情况。他们将使用通用错误消息破坏UX,即使它没有给他们任何额外的安全性。就个人而言,我不会打扰一般的错误消息,因为我的登录还有很多其他限制(验证码,有限的登录尝试),而且登录就像人们放弃网站的第一大原因。
如果您选择显示一般错误消息,那么天哪,请继续尝试。确保任何地方都没有松动的末端。您可以用10英寸厚的钢加固墙壁,但是如果其中有未锁的门,那将无济于事。
评论
Recaptcha求解器很容易破坏Recaptcha。这些网站通常收费低廉,准确率约为70%。验证码(无验证码)对于计算机而言甚至更容易。有时,计算机比人类更胜一筹,因此它只会给用户带来烦恼。
–特拉维斯·佩塞托(Travis Pessetto)
2014年7月7日在21:22
决定什么对您的环境有效是可以的,但是您需要解释为什么做出该决定,以便其他人了解其背景。您的缓解方法无济于事,无法解决枚举用户帐户的问题。您是否觉得枚举对您的环境没有风险?除了提供波浪状的不屑一顾的陈述外,请提供更多。
– schroeder♦
2014年7月7日在21:24
请参阅deathbycaptcha.com和scraping.pro/decaptcher-review。我同意有限的登录尝试。
–特拉维斯·佩塞托(Travis Pessetto)
14年7月7日在21:31
#9 楼
我试图戴上攻击者的帽子,发现2种情况:您的站点有一个注册页面(例如gmail或stackoverflow)。我可以使用注册页面通过暴力破解来找出现有用户的用户名。或者我可以创建一个新用户。我的新gmail或stackoverflow用户可能具有与我被强行使用的相同的权限。
您的网站没有注册页面。您的观点无效。
评论
这个答案是荒谬的。创建新用户将如何做?为什么要在第二点上举起“稻草人”?
– schroeder♦
2014年7月8日在2:43
@schroeder,例如gmail。您可以使用“注册”页面来确定现有的随机gmail用户的身份,然后尝试强行使用密码。但是,随机gmail用户帐户的特权可能会比您可以创建的用户帐户更大吗?
–emory
14年7月8日在11:45
攻击者倾向于使用暴力帐户来获取THAT帐户的数据,而不是简单地获得对系统的访问权限。您正在提出旨在被解雇的问题。
– schroeder♦
2014年7月8日14:10
@schroeder如果我正在攻击特定帐户,那么系统具有注册页面或非通用错误消息这一事实有什么用?例如,入侵了佩林电子邮件的人事先知道了她的用户名。
–emory
14年7月8日在21:11
当然,如果您在攻击前有一个特定的目标,但这也不在问题范围之内。作为攻击者,我想知道将有哪些可用帐户。不是访问系统,而是从他们的帐户中挖掘所有可能的东西:PII,帐户信息,重复使用的密码等。我的观点不是新奇的,也不是寻常的。我感觉到您只是喜欢不屑一顾。
– schroeder♦
14年7月8日在21:17
#10 楼
为了避免在用户注册页面上枚举用户名,应用程序可以根据用户的电子邮件地址自动分配用户名,而无需让用户选择其中一个选项。这样可以防止用户名枚举或注册页面。
此外,我们应该考虑忘记密码的功能,有时这也应该显示有效的用户详细信息。
评论
例如,有些网站如Yahoo邮件,在其中输入正确的用户名,而错误的密码给出了通用消息。输入“错误的用户名”时,会显示一条消息“此用户名未使用...”,以确保安全。我认为这是过去的遗物,在当今的计划中没有地位。此外,当您在Win7锁屏(默认情况下预先选择用户名)上输错密码时,仍然会收到通用消息...
我更喜欢“忘记密码”功能,该功能还告诉我用户名在许多情况下是否有效。该链接通常位于密码字段附近,无需绕过“注册”弯路。