构建安全的网站用户登录认证体系
一、设计数据结构
1、用户数据和登录认证信息数据分开保存。
因为登录认证方式多种多样,方便日后扩展。
2、按照登录认证方式分表保存认证信息。
认证方式可能有用户名(或者邮箱、手机)+密码;手机+动态验证吗;第三方登陆(OAuth、OpenID)等。每种登录方式的处理逻辑都不一样,数据结构可能也不同。
3、不保存明文密码,密码加盐储存。
当然这完全取决于你的职业道德。
二、维护登录会话
一般使用SESSION来保存当前登录会话状态,如果认为SESSION不够安全,可以采取一些额外的防护。比如:SESSION绑定IP;使用HTTPS协议;在COOKIE中增加一次性令牌等措施。
注:所谓一次性令牌就是在用户COOKIE中保存一个随机字符串,当用户进行一次操作请求时就更新这个一次性令牌。服务器会为每个SESSION维护一个一次性令牌,当服务器接收到操作请求时都要验证一下发送请求的客户端浏览器COOKIE中的一次性令牌是否合法。如果发生SESSION被盗用,则盗用者和合法用户中必然会有一人被踢出会话。另外,如果将一次性令牌加入用户请求的URL参数中,还能防止CSRF攻击。
三、记住密码
一般采用在浏览器COOKIE中保存登录令牌的方式来实现“记住密码”功能。一个用户可以同时存在多个不同的登录令牌来满足用户在不同设备上同时登陆的需求。依据登录令牌来恢复用户的登录会话。
流程如下:
1、登录时用户选择“记住密码”则生成一个登录令牌分别保存在浏览器COOKIE和服务器数据库中。
2、用户下一次访问网站时,如果COOKIE中存在登录令牌则尝试验证令牌并恢复登录会话。
3、验证成功后需要更新这个登录令牌,使得旧的令牌失效。
为了增加登录令牌的安全性,可以和SESSION一样,使用一次性令牌。即每次用户和服务器交互时都更新一下登录令牌,以降低令牌被盗用的风险。
另外,登录令牌一般情况下都是绑定平台的。所以可以在生成登录令牌的同时提取用户的“浏览器指纹”,当用户下次使用这个登陆令牌恢复会话时,可以验证用户“浏览器指纹”是否匹配来降低令牌被盗用的风险。“浏览器指纹”包括但不限于:User-Agent、Accept-Language等具有标识性的请求头部,显示器分辨率、客户端时间和时区、浏览器插件信息(如Flash版本号)、Flash Cookie、HTML5 本地储存数据等。
四、密码找回
密码找回就是密码重置,因为网站不应该明文保存用户密码,所以就谈不上找回密码了。
1、安全问答不安全
使用社会工程学方法很容易就能猜解到用户的问题答案。
2、认邮箱(手机)还是认人?
一般网站都使用给注册邮箱发送密码重置链接来重置密码,这意味着一旦邮箱被盗,所有使用该邮箱注册的网站账户全部沦陷。对网站来说,最好不要暴露用户的注册邮箱;对用户来说,最好不要用一个邮箱注册所有的网站(至少SNS账户和支付网站账户的邮箱应该分开)。
3、使用多重验证的方式来重置密码
注意是“多重”,而不是“多种”。
五、防止密码刺探
1、CAPTCHA(验证码)
2、账户异常
特定账户登录失败事件密集发生时——邮件或短信提醒用户,为该账户设置最短登录尝试间隔。
3、IP异常
特定IP登录失败事件密集发生时——Ban IP
------------------------------------------------------
如何设计安全的用户登录功能
1)在cookie中,保存三个东西——用户名,登录序列,登录token。
用户名:明文存放。
登录序列:一个被MD5散列过的随机数,仅当强制用户输入口令时更新(如:用户修改了口令)。
登录token:一个被MD5散列过的随机数,仅一个登录session内有效,新的登录session会更新它。
2)上述三个东西会存在服务器上,服务器的验证用户需要验证客户端cookie里的这三个事。
3)这样的效果,
a)登录token是单实例登录。意思就是一个用户只能有一个登录实例。
b)登录序列是用来做盗用行为检测的。如果用户的cookie被盗后,盗用者使用这个cookie访问网站时,我们的系统是以为是合法用户,然后更新“登录token”,而真正的用户回来访问时,系统发现只有“用户名”和“登录序列”相同,但是“登录token”不对,这样的话,系统就知道,这个用户可能出现了被盗用的情况,于是,系统可以清除并更改登录序列 和 登录token,这样就可以令所有的cookie失效,并要求用户输入口令。并给警告用户系统安全。
4)当然,上述这样的设计还是会有一些问题,比如:同一用户的不同设备登录,甚至在同一个设备上使用不同的浏览器保登录。一个设备会让另一个设备的登录token和登录序列失效,从而让其它设备和浏览器需要重新登录,并会造成cookie被盗用的假象。所以,你在服务器服还需要考虑- IP 地址,
a)如果以口令方式登录,我们无需更新服务器的“登录序

本文详细探讨了如何设计安全的用户登录功能,包括数据结构设计、登录会话维护、记住密码策略、密码找回和防止密码刺探。建议使用哈希和盐来保护密码安全,避免保存明文密码,使用HTTPS确保通信安全,并通过限制登录尝试次数和使用验证码来防止密码猜测。同时,介绍了登录流程,包括客户端和服务器端的密码验证及盐的更新过程。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



