查看原文
其他

为什么说“用户名或密码错误”是反人类的设计?

IT服务圈儿 2023-02-06

The following article is from Python七号 Author somenzz

来源丨经授权转自公众号 Python七号(ID:PythonSeven)

作者丨somenzz

有很多网站和应用,当时注册只是为了一时的需求,后来想再进去查询时,忘记了注册时的用户名或密码,就拿自己印象中的用户名和密码试了下,结果提示“用户名或密码错误”。

作为用户,我想知道,到底是密码错误,还是用户名错误,请减少我的尝试次数。

作为网站和应用,提示“用户名或密码错误”,是为了防止黑客攻击,要知道,黑客是拥有很多已经攻破或泄漏的用户名的和密码的,如果提示密码错误,那黑客就可以使用密码字典[1]里的密码进行暴力破解,如果提示用户名错误,那黑客就会更换用户名进行攻击。

其实,即使网站和应用仅提示“用户名或密码错误”,作为用户,我们也是可以知道,到底是用户名错了,还是密码错了。通常,用户名在数据库里都是唯一的,只需要我们用这个用户名再次注册一下,如果提示用户名已存在,那就说明我们输入的用户名是正确的,否则就是错误的。

既然如此,这样提示用户“用户名或密码错误”是否很多余?

我觉得是的,与其如此,还不如大大方方的告诉用户到底是密码错误,还是用户名不存在,也好让用户节省尝试的时间。

那你可能问了,如何防止黑客攻击呢,有 3 种手段:

1、请求频率限制。我们对登录接口加上频率限制就可以了,比如正常用户一分钟内尝试的次数不会超过 5 次,那么超过 5 次的就让他 10 分钟后再试,或者狠一点的,10 分钟内超过 50 次的 ip 直接拉入黑名单,永久禁止访问。

2、强制使用强密码。让用户使用不低于 12 位的包含数字、字母(含大小写)、特殊字符组成的密码,即使暴力破解,也需要很长时间,让爆破者得不偿失。

3、使用双因素验证。即使爆破出用户名密码,还需要一个动态密码才能登录,具体实现可以参考前文什么是双因素验证 2FA,如何用 Python 实现?

综上,我认为“用户名或密码错误”是一种反用户的设计,请不要在你的应用中这样做。

参考资料

[1]

密码字典: https://github.com/k8gege/PasswordDic

1、原来墙,是这么把我 TCP 连接干掉的!

2、为什么计算机需要操作系统?

3、我的程序跑了60多小时,就是为了让你看一眼JDK的BUG导致的内存泄漏。

4、Java之父偏爱函数式编程,称自己的代码风格被队友批评

5、想看的网页被404?建议你用它解决

点分享

点点赞

点在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存