假设用户正在登录一个典型的站点,输入他们的用户名和密码,并且他们错误地输入了其中一个输入。我注意到大多数(如果不是全部)站点显示相同的消息(类似于“无效的用户名或密码”),尽管只有一个输入是错误的。
对我来说,通知用户哪个输入错误似乎很容易,这让我想知道为什么网站不这样做。那么,这是出于安全原因,还是只是已经成为常态?
假设用户正在登录一个典型的站点,输入他们的用户名和密码,并且他们错误地输入了其中一个输入。我注意到大多数(如果不是全部)站点显示相同的消息(类似于“无效的用户名或密码”),尽管只有一个输入是错误的。
对我来说,通知用户哪个输入错误似乎很容易,这让我想知道为什么网站不这样做。那么,这是出于安全原因,还是只是已经成为常态?
如果恶意用户通过猜测常见的用户名/密码组合(如 admin/admin)开始攻击网站,则攻击者会知道用户名是有效的,因为它返回“密码无效”而不是“用户名或密码无效”的消息。
如果攻击者知道用户名是有效的,他可以使用 SQL 注入或暴力破解密码等技术将精力集中在该特定帐户上。
正如其他人所提到的,我们不希望您知道是否是用户名或密码错误,这样我们就不会那么容易受到暴力破解或字典攻击。
如果一些网站想让他们的用户知道哪个失败,同时仍然处于绿色安全方面,他们可以实施“蜜罐”用户名(例如管理员、管理员等),以提醒网站管理员有人在他们周围窥探。网站。如果他们尝试使用其中一个“蜜罐”用户名登录,您甚至可以设置一些逻辑来禁止他们的 IP 地址。我认识一个人,他实际上有一个网站,并在他们的源代码中输入了一个 HTML 注释,例如“因为你一直忘记理查德:用户名:奶酪密码:Burger123”靠近登录框,目的是监控任何试图使用的 IP 地址该用户名/密码。在开发网站时,添加这样的监控逻辑会很有趣。
当然,记录无效的登录尝试并添加适当的逻辑来处理这些 IP 地址也可以。我知道有些人会不同意我的观点,但是根据网站的类型,我认为只要您添加额外的安全措施来防止不同类型的攻击,让用户知道就没什么大不了的。
我最喜欢的安全实现是由我使用的银行完成的。如果我输入正确的用户名,它会说“Welcome Jimbob!” 然后提示我回答安全问题(如果我从未在此计算机上通过此浏览器登录),等待我正确回答安全问题,然后让我看到我的安全图像/标题并输入我的密码。如果我输入了错误的用户名,我会看到类似“Welcome Bessie/Kareem/Randal!”的内容。其中显示的名称非常少见——尽管对于相同的用户名,您总是使用相同的名称(我通常不确定是一两个用户名;错误的人一直称我为 Frenshelia)。我假设它被实现为某种非加密哈希,应用于任何输入的用户名,该用户名唯一地映射到一长串相当不常见的名称中的一个用户名。这可以让合法用户知道他们是否输入了错误的用户名(即使你有一个像 Bessie 这样的不常见的名字;你随机猜到的错误用户名不太可能映射回你的特定不常见的名字),而不会让尝试的人明显查找用户名不存在的随机帐户。
顺便说一句:我不是特别喜欢安全问题/安全图像部分,这似乎与安全剧院接壤。进行中间人 (MITM) 攻击的老练攻击者(例如,在您的 Web 浏览器中安装假证书后;并通过 DNS/ARP 欺骗将 yourbank.com 指向他们的 IP 地址)可能会等到您尝试登录进入站点,然后在他们的计算机上使用自动脚本登录到真实站点,获取安全问题,将选择的安全问题显示给您,从他们的浏览器将答案发送回站点本身,等待获取安全性图像,将安全图像返回给您,然后等待您从他们那里输入密码,然后他们使用密码以您的身份登录并进行恶意操作。
其他答案可以很好地了解此行为背后的安全原因。尽管它们是正确的,但我很确定至少有些网站只是将授权例程编程为无法分辨出什么错误的方式-登录名或密码。
示例查询:
SELECT COUNT(*) FROM users WHERE login = 'john' AND hash = '2bbfcdf3f09ae8d700402f36913515cd'
这将在成功记录尝试时返回1 ,如果没有具有该名称的用户或该用户具有不同的密码,则返回0 。无法判断条件的哪一部分失败。因此,当谈到显示错误消息时,程序员只是诚实地告诉你出了点问题,他并不确定到底是什么。
我个人在一些基于 PHP 的网站中看到了类似的查询,所以我很确定部分原因来自身份验证过程的编码方式,真的。