关于修改账号密码或者忘记账号密码的过程控制,麻烦帮忙看下 - V2EX
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 2804 次点击
    这是一个创建于 2263 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如用户登录之后修改绑定的邮箱需要以下几个步骤: 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 来做验证的话,那就是个安全漏洞。”不知道可否详细介绍一下你具体指的场景?这个说法总感觉哪里不对。
    0TSH60F7J2rVkg8t
        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. 显示页面让用户输入新邮箱,提交后可再验证一次新邮箱,步骤如上。
    0TSH60F7J2rVkg8t
        6
    0TSH60F7J2rVkg8t  
       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     Solana     907 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 18:36 PVG 02:36 LAX 11:36 JFK 14:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86