V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kayseen
V2EX  ›  Python

关于修改账号密码或者忘记账号密码的过程控制,麻烦帮忙看下

  •  
  •   kayseen · 2019-08-16 23:28:08 +08:00 · 2212 次点击
    这是一个创建于 1686 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如用户登录之后修改绑定的邮箱需要以下几个步骤:
    
    1.输入旧邮箱,发送验证连接
    2.验证成功之后,输入新邮箱,发送验证连接
    3.验证新邮箱的验证连接
    
    请问整个过程是怎么样控制的?比如你没有完成上一步的操作就不能继续下一步?
    可以每操作完成一步,就在 Redis 中计时记录一步,然后到下一步的时候再检验 Redis 中是否有操作记录
    
    请问这样实现可以吗?  其他正规的大型网站是怎么实现的呢?
    
    12 条回复    2019-08-20 01:17:37 +08:00
    mingl0280
        1
    mingl0280  
       2019-08-17 00:09:29 +08:00
    验证链接里有个 token,新邮箱里的激活链接也是个 token,直接在缓存里检查有没有上一步的 token 就行了。缓存过期时间设为你允许的最大时间。
    danmu17
        2
    danmu17  
       2019-08-17 04:48:59 +08:00
    正常情况下都是用 session,
    安全漏洞一般都是用 token 导致的。
    danmu17
        3
    danmu17  
       2019-08-17 04:58:39 +08:00
    准确说是用 session 来做身份验证,
    在这基础上一般同时也会用 token 来防范 csrf 在内的其他问题。
    但是如果你用 token 来做验证的话,
    那就是个安全漏洞。
    phy25
        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 来做验证的话,那就是个安全漏洞。”不知道可否详细介绍一下你具体指的场景?这个说法总感觉哪里不对。
    ahhui
        5
    ahhui  
       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. 显示页面让用户输入新邮箱,提交后可再验证一次新邮箱,步骤如上。
    ahhui
        6
    ahhui  
       2019-08-17 08:04:26 +08:00 via iPhone
    步骤如 5 可要求用户输入在你网站上注册的 id,和邮箱,这样可防止邮箱已经不被原用户所有的情况而改了邮箱
    zzyzxd
        7
    zzyzxd  
       2019-08-17 08:46:54 +08:00
    登录成功就代表身份验证成功,作为网站方,没有责任也没有必要去验证旧邮箱是否仍然是属于该用户的。
    一般大型网站做法:1. 验证新邮箱以保证新邮箱有效。2. 发送一封提醒邮件到旧邮箱。
    visualbasic
        8
    visualbasic  
       2019-08-17 09:33:02 +08:00 via Android
    1.登录状态下检查该用户上一次敏感操作的时间、近期内敏感操作的次数以及该用户账户的安全性。如果频繁出现修改绑定(成功率高)或者安全风险较高的(比如在突然的异地登录时发生操作,不是指账户本身的安全性低),不执行一切操作。前一种避免公共账户或信息遭到披露的账户,后一种避免盗号。
    2.检查该用户近期内的所有申请重置密码邮件的次数,如果未登录状态下出现重复申请、且历史修改成功率低的(万一是网络卡了呢?),或者出现大量申请的,不执行发送邮件。可能是遭到恶意刷邮件。(未登录状态下重复申请且没有历史记录的,默认为可信的请求)
    3.如果是用个人邮箱发送邮件,可以尝试记录向各家邮件提供商发送邮件的数量,毕竟一段时间内数量过多可能被认为是 spam 导致垃圾邮件甚至拒收。当然这个还需要看你的验证码措施和邮件提供商。
    4.对于以上所述的问题账户,可以强制要求人工操作验证(比如填写帐号有关信息、帐号密保信息、帐号的实名制信息、其他绑定的安全措施校验),或者搭一个邮箱接收机器人(或者人工),要求验证旧邮箱和新邮箱发来的邮件,好像也可以实现……
    5.对于公共账户,可以要求必须是某些特定的邮箱后缀,或者最起码不能是各种常见的临时邮箱吧……那也太明显啦
    以上纯属个人臆想。当然有没有用我就不知道了 :-)
    conn4575
        9
    conn4575  
       2019-08-17 11:04:28 +08:00 via Android
    token 只是一个钥匙,可以从服务端换得验证时需要的数据,如这个 token 做什么的,创建时间,过期时间,uid 等,你拿到这些数据后做你想做的就行了。
    忘记密码发送的 token 和修改密码发送的 token 实际上没有什么前后关联,并不是说修改密码的 token 必须来自于某个忘记密码的 token,只是业务流程上设计成用户只有使用忘记密码的 token 才能得到修改密码的 token
    danmu17
        10
    danmu17  
       2019-08-17 18:12:17 +08:00
    @phy25 好奇你具体是从什么地方(书 /教学机构 /教程 /或者其他信息来源)得出关掉页面 session 就会失效这个结论的。
    jinliming2
        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 说的)。
    而一般会在当前页面增加链接帮助跳转到目标邮箱,防止用户关闭浏览器。
    phy25
        12
    phy25  
       2019-08-20 01:17:37 +08:00 via Android
    @jinliming2 #11 Cookie 不失效是对头的,我想说的是以下这几个场景:
    在电脑的用户:我手机上有新邮件耶 > 邮件里有个链接可以点 > 于是手机上没有 Cookie > 怎么不能用
    只提供验证码的邮件:怎么邮件老是不来,放弃了 > 过了一会在另一台终端收到了邮件 > 哦我们继续吧但是新的终端没有 Cookie
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1657 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 16:47 · PVG 00:47 · LAX 09:47 · JFK 12:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.