比如用户登录之后修改绑定的邮箱需要以下几个步骤:
1.输入旧邮箱,发送验证连接
2.验证成功之后,输入新邮箱,发送验证连接
3.验证新邮箱的验证连接
请问整个过程是怎么样控制的?比如你没有完成上一步的操作就不能继续下一步?
可以每操作完成一步,就在 Redis 中计时记录一步,然后到下一步的时候再检验 Redis 中是否有操作记录
请问这样实现可以吗? 其他正规的大型网站是怎么实现的呢?
1
mingl0280 2019-08-17 00:09:29 +08:00
验证链接里有个 token,新邮箱里的激活链接也是个 token,直接在缓存里检查有没有上一步的 token 就行了。缓存过期时间设为你允许的最大时间。
|
2
danmu17 2019-08-17 04:48:59 +08:00
正常情况下都是用 session,
安全漏洞一般都是用 token 导致的。 |
3
danmu17 2019-08-17 04:58:39 +08:00
准确说是用 session 来做身份验证,
在这基础上一般同时也会用 token 来防范 csrf 在内的其他问题。 但是如果你用 token 来做验证的话, 那就是个安全漏洞。 |
4
phy25 2019-08-17 07:42:25 +08:00
新旧邮箱验证流程这个事情要怎么设计,取决于邮箱验证这个动作的有效期有多长。从用户体验的角度考虑,很多人看到要收邮件(拿 token ),很可能就会关掉当前页面,这种情况下 session 不一定是一个好选择,反而会导致某些用户很失望。
当然一个短时间内连续完成的过程,自然是用 session 对头。 只提 Python 不提具体框架不是一个好的提问方式。随手查了一下 Django wizard: https://django-formtools.readthedocs.io/en/latest/ @danmu17 #3 “但是如果你用 token 来做验证的话,那就是个安全漏洞。”不知道可否详细介绍一下你具体指的场景?这个说法总感觉哪里不对。 |
5
0TSH60F7J2rVkg8t 2019-08-17 08:01:34 +08:00 via iPhone
1. 用户点击修改邮箱按钮
2. 生成一个随机字符串,连同邮箱名 hash,创建时间,超时时长等写入数据库 3. 将 2 生成的随机字符串附加到一个 url 上,给用户旧邮箱发送邮件 4. 用户点击邮件跳转后,验证随机字符串参数是否存在于数据库,是否超时,如都没有,进入 5。如果不存在或者已经超时,返回 404 5. 显示网页要求用户输入旧邮箱地址到输入框然后提交。这一步是防止邮箱自己有 url 探测而导致随机字符串失效 6. 用户点了 5 的提交按钮后,验证随机字符串是否正确、验证用户输入的邮箱 hash 是否正确。都正确标记随机字符串已过期 7. 显示页面让用户输入新邮箱,提交后可再验证一次新邮箱,步骤如上。 |
6
0TSH60F7J2rVkg8t 2019-08-17 08:04:26 +08:00 via iPhone
步骤如 5 可要求用户输入在你网站上注册的 id,和邮箱,这样可防止邮箱已经不被原用户所有的情况而改了邮箱
|
7
zzyzxd 2019-08-17 08:46:54 +08:00
登录成功就代表身份验证成功,作为网站方,没有责任也没有必要去验证旧邮箱是否仍然是属于该用户的。
一般大型网站做法:1. 验证新邮箱以保证新邮箱有效。2. 发送一封提醒邮件到旧邮箱。 |
8
visualbasic 2019-08-17 09:33:02 +08:00 via Android
1.登录状态下检查该用户上一次敏感操作的时间、近期内敏感操作的次数以及该用户账户的安全性。如果频繁出现修改绑定(成功率高)或者安全风险较高的(比如在突然的异地登录时发生操作,不是指账户本身的安全性低),不执行一切操作。前一种避免公共账户或信息遭到披露的账户,后一种避免盗号。
2.检查该用户近期内的所有申请重置密码邮件的次数,如果未登录状态下出现重复申请、且历史修改成功率低的(万一是网络卡了呢?),或者出现大量申请的,不执行发送邮件。可能是遭到恶意刷邮件。(未登录状态下重复申请且没有历史记录的,默认为可信的请求) 3.如果是用个人邮箱发送邮件,可以尝试记录向各家邮件提供商发送邮件的数量,毕竟一段时间内数量过多可能被认为是 spam 导致垃圾邮件甚至拒收。当然这个还需要看你的验证码措施和邮件提供商。 4.对于以上所述的问题账户,可以强制要求人工操作验证(比如填写帐号有关信息、帐号密保信息、帐号的实名制信息、其他绑定的安全措施校验),或者搭一个邮箱接收机器人(或者人工),要求验证旧邮箱和新邮箱发来的邮件,好像也可以实现…… 5.对于公共账户,可以要求必须是某些特定的邮箱后缀,或者最起码不能是各种常见的临时邮箱吧……那也太明显啦 以上纯属个人臆想。当然有没有用我就不知道了 :-) |
9
conn4575 2019-08-17 11:04:28 +08:00 via Android
token 只是一个钥匙,可以从服务端换得验证时需要的数据,如这个 token 做什么的,创建时间,过期时间,uid 等,你拿到这些数据后做你想做的就行了。
忘记密码发送的 token 和修改密码发送的 token 实际上没有什么前后关联,并不是说修改密码的 token 必须来自于某个忘记密码的 token,只是业务流程上设计成用户只有使用忘记密码的 token 才能得到修改密码的 token |
10
danmu17 2019-08-17 18:12:17 +08:00
@phy25 好奇你具体是从什么地方(书 /教学机构 /教程 /或者其他信息来源)得出关掉页面 session 就会失效这个结论的。
|
11
jinliming2 2019-08-18 09:45:01 +08:00 via iPhone
@phy25 https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
关掉页面不会导致 session cookie 失效,关掉浏览器才会。甚至部分浏览器会让 session cookie 永远不失效(上面 MDN 说的)。 而一般会在当前页面增加链接帮助跳转到目标邮箱,防止用户关闭浏览器。 |
12
phy25 2019-08-20 01:17:37 +08:00 via Android
@jinliming2 #11 Cookie 不失效是对头的,我想说的是以下这几个场景:
在电脑的用户:我手机上有新邮件耶 > 邮件里有个链接可以点 > 于是手机上没有 Cookie > 怎么不能用 只提供验证码的邮件:怎么邮件老是不来,放弃了 > 过了一会在另一台终端收到了邮件 > 哦我们继续吧但是新的终端没有 Cookie |