所有需要登录的网站,都会提供"找回密码"的功能,防止用户忘记密码。
正确设计这个功能,保证安全可靠,并不简单。下面就是安全专家 Troy Hunt 给出的设计指南。
一、如何保存密码
一个网站要想保证密码安全,第一步就是以正确的方法保存密码。一般说来,密码有三种保存方式。
(1)明文保存
"明文保存"就是用户的密码原文不动地写入数据库。这种方式最不安全,极易泄漏,应该严格禁用。
(2)加密保存
"加密保存"就是使用密钥,将密码加密后,以密文保存进数据库。这种方式虽然有一定的安全性,但是终究还是可以用密钥还原密码。因此,还是存在泄漏的可能,也不推荐使用。
(3)哈希保存
"哈希保存"就是对密码使用哈希算法,将哈希值保存进数据库。为了增加随机性,防止彩虹表这一类的工具,计算哈希的时候,每个用户都有一个不一样的盐值(salt),也会同时保存进数据库。
哈希是单向运算,无法还原,所以即使哈希值泄漏,一般来说,也不会暴露用户的原始密码。
第一条规则:密码永远都要哈希保存。
二、密码重置
如果密码是哈希保存,用户一旦忘记密码,网站也无法知道原始密码是什么,只能让用户重置密码。
第二条规则:找回密码就是让用户重置密码。
重置密码又有两种做法。有的网站先自动改成一个随机密码,然后再让用户登录后自己改掉。这样做的风险在于,你必须把随机密码告知用户,通过邮件或短信,这个过程中就有可能泄漏。
第三条规则:重置密码的时候,要给出一个链接,让用户到网页上自己修改密码。
重置链接由于是明文传播,而且直接修改密码,所以必须有失效时间。一般来说,可以设成10分钟失效。
三、用户名还是邮件地址?
重置密码之前,必须知道重置谁的密码。这时需要用户提供,注册时的邮件地址。
第四条规则:重置密码之前,如果用户提供了错误的邮件地址,不要提示他。
这是因为如果提示了,数据库不包含某个邮件地址,就可能像下图那样,泄露用户的隐私,被钓鱼者利用。
正确的做法是,不管用户输入什么邮箱,都向该邮箱发邮件。在邮件里说明,有人尝试重置密码,但是他输入的邮箱不在数据库里面。
如果不是采用邮件地址,而是根据用户名识别用户,就没有办法不提示,某个用户名是否存在。某些人的用户名非常特殊,一旦知道该用户名存在,就几乎可以肯定是该人注册的。
第五条规则:重置密码的时候,识别用户最好依靠邮件地址,而不是用户名。
四、过滤用户
为了防止机器人攻击,进入重置密码之前,最好加上 CAPTCHA 识别。
此外,还要防止一种情况:张三知道李四的邮箱,然后使用找回密码功能,让系统给李四发出重置密码的邮件。
第六条规则:如果条件允许,重置密码之前,最好请用户回答一些个人问题,或者采用 2FA 验证,比如短信验证码。
最后,不要忘了记录 IP 地址,在邮件里面告诉用户,哪个 IP 地址在申请重置你的密码。
(完)
dj 说:
受教,谢谢。
2019年2月 7日 19:46 | # | 引用
hulk 说:
AlotPorn瞩目
2019年2月 7日 20:04 | # | 引用
Draem 说:
AlotPorn有点秀
2019年2月 7日 23:05 | # | 引用
铁粉 说:
AlotPorn给了你多少广告费?
2019年2月 8日 14:10 | # | 引用
PornHub 营销员 说:
AlotPorn给了你多少广告费?
我 PornHub 给你10倍!英语培训费(毕竟全球最大的线上英文学习网站XD
2019年2月 8日 15:47 | # | 引用
岩兔站 说:
看大佬的文章总能涨姿势…
2019年2月 8日 17:14 | # | 引用
qwegssg 说:
如果发送了邮箱不存在的提示会有什么风险?有没有钓鱼者来回答一下。
2019年2月 9日 10:42 | # | 引用
someone 说:
简单明快,没有一句废话,非常喜欢阅读
2019年2月11日 09:40 | # | 引用
Mark 说:
涉嫌传播色情网站啊
2019年2月11日 13:44 | # | 引用
Thinker 说:
卧槽、评论才是涉嫌传播
2019年2月11日 16:29 | # | 引用
SomeDrink 说:
重置密码如果是用手机号码呢
2019年2月11日 16:36 | # | 引用
intijk 说:
用户名那个,应该和邮件一样,不管输入什么用户名,都告诉前端已发送验证邮件(后台发现没用用户则不发送),这样不就不会泄漏特定用户名了。
2019年2月12日 09:00 | # | 引用
vv 说:
阮大神,我是一只前端小菜鸡。遇到一个难搞的问题想请教大神,html元素怎么赋给变量呢?不是通过字符串那种形式,a = $("#sendInspectBtn")[0]类似于这种形式,但现在元素没在html中,不知道怎么赋值了
2019年2月12日 09:33 | # | 引用
点辰星 说:
首先要确认标签在dom中,通过dom就可以拿到的。如果标签没在dom中,那么创建的时候必须放在可访问的变量中才能拿到。
2019年2月12日 11:15 | # | 引用
holegots 说:
会被扫号 得出他手里的邮箱有没有在这个网站上有账号
2019年2月12日 15:59 | # | 引用
小杨 说:
配图秀
2019年2月12日 16:05 | # | 引用
debby 说:
你好,這篇寫得好讚!不過我有點好奇,因為您所參考的 Troy Hunt 那篇文章已經是2012年的文章了,這些方式到現在2019年都不變都ㄧ樣使用嗎? 謝謝
2019年2月12日 16:18 | # | 引用
fan 说:
个人猜想,这个不存在提示出现就可以知道没提示的是在这个邮箱注册过的,然后通过使用这个网站名义向用户发送带有木马的邮件,让用户点击链接。还有可以给这个邮箱发送电诈邮件,说你在这个网站注册时违法的,将你手头上的资金转到安全账户上之类的话。然后什么网站涉及非法集资,要他到某个地方进行说明
2019年2月12日 17:09 | # | 引用
道可道 说:
不看评论我都不知道 AlotPorn 是个什么网站
2019年2月13日 10:50 | # | 引用
AyoCross 说:
受教了,这种逻辑应该经常会出现
2019年2月13日 16:19 | # | 引用
DeanFeng 说:
学习了,想想12306的账号密码泄露就来气,最起码不能明文保存啊。
哈希保存密码,除了自己没有人知道你的密码是多少,就算数据库泄露也是,这才对啊
2019年2月13日 20:29 | # | 引用
luxl 说:
避免泄露过多的账户细节,有或没有,对或不对,都是给试对机会。
邮箱验证是以邮箱为维度考虑的。只有用户密码的简单账号,大多做法只返回 账号密码错误。不会再提示用户账户不存在,或是密码错误了。
2019年2月14日 09:52 | # | 引用
royaso 说:
文章内容不错,但可惜不是原创而是翻译的,看起来像是为了发广告而发的"水文".
而且,原文作者很贴心地提供了一键切换的功能,以免那张截图NSFW,但博主没有"麻烦一点"搬运过来.哎...
2019年2月19日 10:51 | # | 引用
waldenpond 说:
图亮了
2019年2月19日 11:30 | # | 引用
末日菇 说:
他就可以通过试错知道网站某个真实用户的邮箱.然后发送钓鱼邮件.内容-->检测你的账号存在风险,点击链接修改密码.(附带钓鱼链接)
2019年2月21日 11:20 | # | 引用
meahu 说:
我是来咬文嚼字的。“所有需要登录的网站,都会提供"找回密码"的功能,防止用户忘记密码。”一读就感觉怪怪的,“找回密码”功能并不能并不能防止用户忘记密码,而是用户忘记密码的时候能够找回。
2019年2月21日 13:23 | # | 引用
Alexa 说:
已举报
2019年2月21日 17:33 | # | 引用
KKM 说:
请问一下 那注册时邮箱栏存在的话返回什么呢 返回已存在不是一样可以被利用吗
2019年3月12日 00:05 | # | 引用
seaver 说:
不用那个alotporn 不能说明问题严重性
2019年3月21日 10:30 | # | 引用
火鸡科学家 说:
我决定访问一下示例网站,加深自己对这篇文章的理解
2019年3月26日 10:51 | # | 引用
Can ???? 说:
现在好多App登陆都是不用密码,就是用短信验证了啊
2019年3月28日 07:50 | # | 引用
Di Da 说:
不太能认同
> 正确的做法是,不管用户输入什么邮箱,都向该邮箱发邮件。在邮件里说明,有人尝试重置密码,但是他输入的邮箱不在数据库里面。
这一条,如果确定该用户不在数据库中,那么继续发送邮件一是浪费,二是容易造成滥用。
很多站点采用的是前台永远成功,后台过滤。
2019年4月 2日 19:43 | # | 引用
头文字zhu 说:
嗯,看完这篇文章,收获了不少。。。
2019年4月 8日 22:42 | # | 引用
7叶 说:
如果提示的话,你可以知道你的朋友是否在AltPorn上注册了(很大可能性是他本人注册使用的),这样就算隐私泄漏了吧。
2019年4月16日 08:57 | # | 引用
三分道人 说:
别人可以知道你有没有注册lsp网站呗……
2021年3月25日 17:24 | # | 引用