登陆注册接口的安全风险与解决方案

760人浏览 / 0人评论

参考

https://mp.weixin.qq.com/s/njX6buMKgtiCB3jXsNrHVg

一、暴力破解

只要网站是暴露在公网的,那么很大概率上会被人盯上,尝试爆破这种简单且有效的方式(通过各种方式获得了网站的用户名之后,通过编写程序来遍历所有可能的密码,直至找到正确的密码为止)。

解决方案

1、验证码

实现:在密码错误达到一定次数时,增加验证码校验!比如我们设置,当用户密码错误达到 3 次之后,则需要用户输入图片验证码才可以继续登录操作。

问题:验证码防范并非100%安全,仍然可以被破解。

2、登录限制

实现:直接限制非正常用户的登录操作,当它密码错误达到一定次数时,直接拒绝用户的登录,隔一段时间再恢复。比如我们设置某个账号在登录时错误次数达到10次时,则5分钟内拒绝该账号的所有登录操作。

问题:攻击者只需要无限循环遍历所有的用户名(即使没有,随机也行)进行登录,那么这些用户会永远处于锁定状态,导致正常的用户无法登录网站!

3、IP限制

实现:设定某个IP下调用登录接口错误次数达到一定时,则禁止该IP进行登录操作。

问题:现在很多学校、公司都是使用同一个出口IP,如果直接按IP限制,可能会误杀其它正常的用户;并且攻击者完全可以在IP被封后切换VPN来攻击。

4、手机验证

实现:

  • 当用户输入密码次数大于3次时,要求用户输入验证码(最好使用滑动验证)。
  • 当用户输入密码次数大于10次时,弹出手机验证,需要用户使用手机验证码和密码双重认证进行登录。

问题:注意手机验证码防刷。

防刷方案:http://tools.jbritian.com/link/0

  • 图形验证码限制:图形验证通过后再请求接口
    • 图形验证码限制是最常用的一种方式,用户输入图形验证码并通过之后,再请求短信接口获取验证码。
  • 时间限制:60秒后才能再次发送
    • 这种措施使用得比较普遍,从发送验证码开始,前端(客户端)会进行一个60秒的倒数,在这一分钟之内,用户是无法提交多次发送信息的请求的。但是却不是非常有用,技术稍微好点的人完全可以绕过这个限制,直接发送短信验证码。
  • 手机号限制:同一个手机号,24小时之内不能够超过5条
    • 对使用同一个手机号码进行注册或者其他发送短信验证码的操作的时候,系统可以对这个手机号码进行限制,例如,24小时只能发送5条短信验证码,超出限制则进行报错(如:系统繁忙,请稍后再试)。然而,这也只能够避免人工手动刷短信而已,对于批量使用不同手机号码来刷短信的机器,这种方法也是无可奈何的。
       

二、中间人攻击

中间人攻击(man-in-the-middle attack, abbreviated to MITM) ,简单一点来说就是,A 和 B 在通讯过程中,攻击者通过嗅探、拦截等方式获取或修改A和B的通讯内容。在登录过程中,如果攻击者在嗅探到了从客户端发往服务端的登录请求,就可以很轻易的获取到用户的用户名和密码。

解决方案

1、HTTPS

防范中间人攻击最简单也是最有效的一个操作,更换 HTTPS,把网站中所有的 HTTP 请求修改为强制使用 HTTPS。

为什么 HTTPS 可以防范中间人攻击?

HTTPS 实际上就是在 HTTP 和 TCP 协议中间加入了 SSL/TLS 协议,用于保障数据的安全传输。相比于 HTTP,HTTPS 主要有以下几个特点:

  • 内容加密
  • 数据完整性
  • 身份验证

2、加密传输

在 HTTPS 之外,我们还可以手动对敏感数据进行加密传输:

  • 用户名可以在客户端使用非对称加密,在服务端解密;
  • 密码可以在客户端进行MD5之后传输,防止暴露密码明文。

三、其他

除了上面我们聊的这些以外,其实还有很多其它的工作可以考虑,比如:

  • 操作日志:用户的每次登录和敏感操作都需要记录日志(包括IP、设备等);
  • 异常操作或登录提醒:有了上面的操作日志,那我们就可以基于日志做风险提醒,比如用户在进行非常登录地登录、修改密码、登录异常时,可以短信提醒用户;
  • 拒绝弱密码:注册或修改密码时,不允许用户设置弱密码;
  • 防止用户名被遍历:有些网站在注册时,在输入完用户名之后,会提示用户名是否存在。这样会存在网站的所有用户名被泄露的风险(遍历该接口即可),需要在交互或逻辑上做限制。

全部评论