很多网站都有登录功能,那么在设计登录功能时,应该考虑哪些方面呢?
1 安全问题
对于暴露在互联网的网站,安全是一个不可忽视的问题。
登录通常是指用户在客户端输入账号和密码,传输到服务端进行登录认证的过程。在这个过程中,攻击者通常利用暴力破解、中间人攻击等手段进行非法登录或者干扰系统正常运行。
1.1 暴力破解
攻击者在获得登录账号后,通过遍历所有可能的密码,直到找到正确的密码。
只要攻击者登录错误的次数是无限制的,最终都能找到正确的密码。所以防御暴力破解最直接的思路就是阻止攻击者可以无限次尝试登录。而更加有效的方法是增加操作用户身份确认的流程。
1.1.1 IP限制
限制一个IP在单位时间内的访问次数。正常用户通过页面与服务器的交互频率是不会超过一定阈值的,所以当一个IP的请求次数过于频繁时,可以认为是恶意攻击。通过niginx的限流模块就可以简单地实现IP限流。IP限制本质上也是增加了暴力破解的时间成本。
但IP限制本身存在以下的不足:
- 一些使用局域网的场所,例如学校、公司等通常都是共享几个出口IP,这种情况下不适合按IP的粒度进行限制。
- 攻击者可以使用VPN,当IP被限制后可以切换其它VPN。
- 还有哪些问题,待补充???
1.1.2 图形验证码
当登录次数超过5次后,增加图形验证码校验流程。这样攻击者在尝试登录时,就增加了识别出图形验证码的成本。
不足:目前OCR技术相当成熟,普通的图形验证码难以阻挡攻击。即使是滑动验证也无法保证完全可靠。
图形验证码和滑动验证本质也是增加了攻击成本。
1.1.3 操作用户身份验证
现在手机卡有实名认证,可以作为用户的身份标识。只要网站账号绑定了手机号,就可以通过手机短信验证码来验证当前操作用户的身份。
参考流程如下:
- 当用户密码错误次数大于3次时,要求用户输入图形验证码(最好使用滑动验证)。
- 当用户密码错误次数大于10次时,增加操作用户身份验证,需要用户使用手机验证码和密码双重认证进行登录。
通过账号密码、图形验证码可以解决大部分的暴力破解攻击,而手机短信验证码可以解决比较顽固的暴力破解攻击,所以两者相结合是一个比较合理的登录认证方案。虽然不存在绝对安全的系统,但我们可以结合具体的使用场景选择合适的安全方案,尽可能的增加攻击者的攻击成本,同时也要考虑防御的成本。
1.2 中间人攻击
攻击者通过拦截客户端和服务器之间的通讯内容,从而获取到用户账号和密码或篡改数据。
1.2.1 HTTPS
HTTPS使用了TLS协议,可以保障数据传输的安全性,所以它是一个防御中间人攻击的简单有效的方法。
数据安全传输的条件:
- 加密传输。防止数据被窃听。
- 数据完整性验证。防止数据被篡改。
- 身份验证。防止中间人冒充身份。
注:关于数据传输安全性可以参考该文章。
HTTPS原理:
- 客户端发起请求。将【随机数random1+支持的对称加密算法】发送给服务端。
- 服务端将【随机数random2+确定的对称加密算法+数字证书】响应给客户端。
- 客户端验证服务端数字证书的合法性。生成随机数random3并用数字证书中的公钥加密后发送给服务端。
- 服务端使用私钥解密拿到随机数random3,用约定好的对称加密算法 将三个随机数random1、random2和random3生成秘钥。
- 至此,HTTPS的握手完成。后续,通讯双方使用约定好的对称加密算法和秘钥进行加密传输。
总结:HTTPS在正式传输业务数据前,会有一个类似TCP“握手”的过程。主要完成了两个事情:1、通过数字证书验证服务器身份;2、在第3、4步使用了非对称加密,保证最终生成的秘钥只有通信双方知道。所以使用该秘钥加密的报文只有通信双方能够解密,起到了 防止数据被窃听、被篡改的作用。
饿了么