这篇文章主要是和大家聊一聊,在设计一个登录接口时,不仅仅是功能上的实现,在安全方面,我们还需要考虑哪些地方。* Y' R h* N! ~% a 一、暴力破解 0 Q+ t: Y) w* w1 H 只要网站是暴露在公网的,那么很大概率上会被人盯上,尝试爆破这种简单且有效的方式:通过各种方式获得了网站的用户名之后,通过编写程序来遍历所有可能的密码,直至找到正确的密码为止。; y4 W9 N, v$ A0 v
伪代码如下:% V$ Z. @. y3 u$ `$ L
fail_count = get_from_redis(fail_username)
if fail_count >= 3:
if captcha is None:
return error( 需要验证码 )
check_captcha(captcha)
success = do_login(username, password)
if not success:
set_redis(fail_username, fail_count + 1)
有聪明的同学就想到了,我可以在它密码错误达到一定次数时,增加验证码校验!比如我们设置,当用户密码错误达到3次之后,则需要用户输入图片验证码才可以继续登录操作: ! j8 W" {/ z( R2 M 伪代码未考虑并发,实际开发可以考虑加锁。这样确实可以过滤掉一些非法的攻击,但是以目前的OCR技术来说的话,普通的图片验证码真的很难做到有效的防止机器人(我们就在这个上面吃过大亏)。9 ]* v7 S! @. j" z% x2 Y
当然,我们也可以花钱购买类似于三方公司提供的滑动验证等验证方案,但是也并不是100%的安全,一样可以被破解(惨痛教训)。 $ g& s' [6 v# z& F登录限制 ; n' u. [) d. D, z 那这时候又有同学说了,那我可以直接限制非正常用户的登录操作,当它密码错误达到一定次数时,直接拒绝用户的登录,隔一段时间再恢复。比如我们设置某个账号在登录时错误次数达到10次时,则5分钟内拒绝该账号的所有登录操作。 , J: k' v9 F, h/ E) {, U2 k
fail_count = get_from_redis(fail_username)
if fail_count > 3:
if captcha is None:
return error( 需要验证码 )
check_captcha(captcha)
if fail_count > 10:
# 大于10次,使用验证码和密码登录
if dynamic_code is None:
return error( 请输入手机验证码 )
if not validate_dynamic_code(username, dynamic_code):
delete_dynamic_code(username)
return error( 手机验证码错误 )
success = do_login(username, password, dynamic_code)
if not success:
set_redis(fail_username, fail_count + 1)
我们结合了上面说的几种方式的同时,加上了手机验证码的验证模式,基本上可以阻止相当多的一部分恶意攻击者。但是没有系统是绝对安全的,我们只能够尽可能的增加攻击者的攻击成本。大家可以根据自己网站的实际情况来选择合适的策略。 ( u r6 V6 Z# b$ m二、中间人攻击/ { V; o. o' @5 L% o6 C' n
什么是中间人攻击1 p# i0 q3 u# o
中间人攻击(man-in-the-middle attack, abbreviated to MITM),简单一点来说就是,A和B在通讯过程中,攻击者通过嗅探、拦截等方式获取或修改A和B的通讯内容。+ M3 S8 d' R# J) c J. c
举个栗子:小白给小黄发快递,途中要经过快递点A,小黑就躲在快递点A,或者干脆自己开一个快递点B来冒充快递点A。然后偷偷的拆了小白给小黄的快递,看看里面有啥东西。甚至可以把小白的快递给留下来,自己再打包一个一毛一样的箱子发给小黄。 ' z% \8 k: Z8 `/ W 那在登录过程中,如果攻击者在嗅探到了从客户端发往服务端的登录请求,就可以很轻易的获取到用户的用户名和密码。4 ^4 i; v+ e2 @/ X* K
HTTPS % l) S- Q- k& p 防范中间人攻击最简单也是最有效的一个操作,更换HTTPS,把网站中所有的HTTP请求修改为强制使用HTTPS。0 f1 d( }5 A0 G) t
为什么HTTPS可以防范中间人攻击? " m: N( W3 ? ?4 H* j9 O HTTPS实际上就是在HTTP和TCP协议中间加入了SSL/TLS协议,用于保障数据的安全传输。相比于HTTP,HTTPS主要有以下几个特点: / a2 E( ?5 F# b4 x1 e$ F$ f
内容加密
数据完整性0 W& _4 L- E j1 Z3 E4 y0 [
身份验证 9 L; S( I/ m) ?* s8 D& m- i( h 具体的HTTPS原理这里就不再扩展了,大家可以自行Google( r8 S' k- C5 a, |
加密传输- ]5 S$ m/ D: d1 ]5 r6 ]9 ~
在HTTPS之外,我们还可以手动对敏感数据进行加密传输: " g- \% @" e5 s6 [& c% i2 P6 K& i