记录失败的登录尝试会泄露密码


38

我开始在网站上记录失败的登录尝试,并显示以下消息

Failed login attempt by qntmfred

我注意到其中一些日志看起来像

Failed login attempt by qntmfredmypassword

我猜有些人登录失败,因为他们在用户名字段中输入了用户名和密码。密码在数据库中进行了哈希处理,但是,如果数据库因某种原因受到损害,这些日志消息可能是攻击者找出密码的方法,无论有多少人最终登录失败,这种密码都是如此。

有没有更好的方法来解决这个问题?我还要担心这种可能性吗?


14
是的,您应该为此担心。
FoolishSeth


4
有趣的问题,因为它涉及UX和安全性。如Michael的链接之一所述,您可以防止大多数情况下使用Javascript(客户端)。密码字段为空时,禁用登录按钮。没有Javascript的用户仍可以那种方式使用登录屏幕,因为在这种情况下不会禁用该按钮。
MSalters

Answers:


65

像这样尝试:

如果用户名存在,则记录“登录失败尝试者username”。如果不是,请记录“ IP失败的登录尝试123.45.67.89”。那应该解决密码意外出现在日志中的问题。


14
您也可以检查一个空密码,并在这种情况下失败并显示相应的错误。
Mike Weller

打印用户名是OP所描述的问题。有时,由于用户缺少[tab]键并在用户名字段中快速键入用户名和密码,然后按Enter键,导致登录失败。您的建议无法解决。
BZink

7
@BZink:是的。 如果用户名存在,则将其记录下来。如果用户不小心将密码添加到用户名上,则生成的字符串几乎肯定不是有效的用户名。
梅森惠勒2013年

12

为什么不简单地检查数据库中是否存在这样的用户名?这将为您带来2种可能的结果。

  1. 用户输入了正确的用户名。然后,您可以简单地记录您现在记录的内容。

  2. 用户在用户名字段中输入了密码,因此用户名无效。只需输入一个日志条目,说明身份不明的用户尝试登录失败?

当然,您可以有一个额外的字段来记录ip,日期和其他内容?


3
为什么不将用户名的哈希附加到#2中的日志条目中。这将隐藏密码,但同时允许某人查看日志以确定同一身份不明的用户是否进行了多次尝试。
emory

如果没有包含用户名的记录,则很明显他们输入了错误,因此对于进行故障排除仍然很有用。
JeffO

2
@emory,如果用户错误地输入了密码和用户名,则没有可行的方法仅提取字符串的用户名部分。我认为很少有人反复输入他们的密码作为用户名字段。这是您执行的“一次性”错误。发生在我们当中最好的,但是我怀疑有人愚蠢到不知道就继续做下去:D
galdikas

@galdikas无需从用户名中提取任何内容。例如,我是用户“ user”,密码为“ password”。我使用“ userpassword”登录,您的哈希函数将“ userpassword”映射到17。日志将显示“身份不明的用户17尝试登录失败”。
emory 2013年

1
@galdikas可能没有足够的愚蠢或持久性足以使它多次执行,但是有些脚本却愚蠢和持久性足以使它执行数千次。您不想知道区别吗?
埃默里

1

注意事项:

  1. 您可以检测到发生这种情况的时间,而不是有人误输入用户名吗?记录错误键入的用户名可用于支持目的,即回答“为什么我无法登录”问题,答案为“您键入错误的用户名,应为破折号而不是点”或“您的冒号开头”然后空格-您是否剪切并粘贴了它”。如果您的高价值付费用户数量很少(即没有另一个社交网站),那么您可能必须提供这种支持。

  2. 有人应该采取什么适当的措施?用户名可能是黑客尝试的指示。用户名未出现在列表中这一事实并不意味着您不需要知道它是什么。但是,如果您认为这是一个严重的问题,并且可以检测到密码是谁的,则可以要求用户在密码发生后更改其密码。

  3. 什么是行业惯例? 行业惯例是记录用户名字段而不是密码字段。您不太可能因此而被解雇。

除非您有特殊的考虑,否则我建议您遵循行业惯例,并记录用户名字段。如果您认为此密码不足,请考虑将密码强制更改作为建议2。


1

为了安全起见,当前应用程序中的日志记录不存储传递给登录方法或密码重置方法的参数。日志调用具有一个可选参数来控制此参数,将其设置为true时,会将其替换为存储的参数对象[Redacted]。当然,所以我错过了一些数据,但是我有他们的IP地址,所以我不愿意冒用明文形式获取敏感内容的风险。

如果您确实想记录这种情况,建议您在记录登录尝试时,检查数据库中是否有名称与用户名字段中的名称匹配的用户,并且仅在匹配时才进行存储。否则,您只需将其存储为“未知用户”即可。您可能会花哨的,检查此值是否包含该值或其他值,但始终存在获得[User] [Password]和[UserPas] [sword]之类的组合的风险,在这种情况下,您可以检查IP并推断出您无意间将某人密码的开头存储在明文中。您可以将其扩展到不太可能但可能的[User] [Password]和[UserPassword] [??],在这种情况下,您可以看到“ UserPassword登录失败”,然后是“ User登录成功”并推论所有用户密码。通常,为了安全起见,除非登录成功,否则不要登录用户名。

编辑添加:

我认为,人们发布的用于登录失败的用户名的大多数参数可以通过其他方法更好地处理。

例如,有人说,当客户问“我为什么不能登录?”时,登录的用户名将允许您指出错别字。的确如此,但是不值得冒着捕获密码的风险。我可以通过在失败时将用户重定向回登录表单来完成此操作,突出显示用户名字段,并使用他们键入的内容重新填充它,以便他们自己查看。

另一个论点是,它可以让您识别黑客攻击的企图。针对一个用户名的一连串失败很可能是暴力破解密码的尝试。我可以通过在Users表上有一个“ BadLogins”列来完成此操作,每次登录失败并使用与该用户名匹配的用户名时,该列都会增加,并在告诉用户“有x自您上次登录以来未成功进行登录尝试”,并就他们认为尝试失败的原因向他们提供建议。如果您想真正做到透彻,则可以有另一列即使在成功登录后也存储BadLogins列的最后一个值,和/或一列存储该列的最高值,和/或一列存储此帐户曾经有过的失败登录总数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.