首页 » 谷歌 » WEB程序时,伪代码未考虑并发,实际开发可以考虑太多

WEB程序时,伪代码未考虑并发,实际开发可以考虑太多

 

谷歌锁区号/谷歌邮箱老号-购买商城
谷歌play地区代改
Google Voice号码支持自助购买
谷歌锁区号购买商城]
美区VISA卡代开-可以用于aws,azure,FB,谷歌,亚马逊,速卖通,eBay,独立站,paypal等支付
如果您还有其他问题可以加我QQ交流。
QQ号:2802364971

前言

当大家学习写程序的时候,第一行代码就是hello world。但是当你开始学习WEB后台技术的时候,很多人的第一个功能就是写login(悄悄话:别人我不知道,反正我是)。然而,当我采访或与很多工作经验不长的同学交流时,我发现虽然很多同学在简历上写着自己负责项目的登录/注册功能模块的开发和设计,但他们只是简单地意识到功能。逻辑,不太考虑安全性。本文主要是和大家聊天。在设计登录界面时,不仅是功能实现,还有我们在安全方面需要考虑的问题。

安全风险暴力破解!

只要网站暴露在公网中,就有很大概率会被人盯上。尝试爆破这个简单有效的方法:通过各种方法获取网站的用户名后,编写程序遍历所有可能的密码,直到找到正确的密码

伪代码如下:

# 密码字典
password_dict = []
# 登录接口
login_url = ''
def attack(username):
 for password in password_dict:
     data = {'username': username, 'password': password}
       content = requests.post(login_url, data).content.decode('utf-8')
       if 'login success' in content:
           print('got it! password is : %s' % password)

那么我们该如何预防这种情况呢?

验证码

有聪明的同学想到了,我可以在密码错误达到一定次数时增加验证码验证!比如我们设置当用户密码错误3次时,用户需要输入图片验证码才能继续登录操作:

伪代码如下:

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)

伪代码不考虑并发,实际开发可以考虑加锁。

这确实可以过滤掉一些非法攻击,但是以现在的OCR技术,普通的图片验证码真的很难有效的防范机器人(我们为此吃了不少苦头)。当然,我们也可以花钱购买三方公司提供的滑动验证等验证方案,但不是100%安全,可以破解(惨痛的教训)。

登录限制

这时另一个同学说,那我可以直接限制异常用户的登录操作。当密码错误达到一定次数时,会直接拒绝用户登录,过一段时间再恢复。比如我们设置一个账号登录10次错误google登录异常活动无法验证,该账号的所有登录操作都会在5分钟内被拒绝。

伪代码如下:

fail_count = get_from_redis(fail_username)
locked = get_from_redis(lock_username)

if locked:
 return error('拒绝登录')
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)
    if fail_count + 1 >= 10:
     # 失败超过10次,设置锁定标记
     set_redis(lock_username, true, 300s)

嗯,这个确实可以解决用户密码被爆的问题。但是,这会带来另一个风险:虽然攻击者无法获取网站的用户信息,但它可以使我们网站的所有用户都无法登录!攻击者只需要无限循环循环所有用户名(即使没有,随机)登录,那么这些用户将被永远锁定,导致普通用户无法登录网站!

知识产权限制

既然直接针对用户名是不够的,我们可以处理IP,直接屏蔽攻击者的IP,一切都会好起来的。我们可以设置某个IP调用登录接口google登录异常活动无法验证,出现一定次数的错误,该IP就会被禁止登录。

伪代码如下:

ip = request['IP']
fail_count = get_from_redis(fail_ip)
if fail_count > 10:
 return error('拒绝登录')
# 其它逻辑
# do something()
success = do_login(username, password)
if not success:
 set_redis(fail_ip, true, 300s)

这也能在一定程度上解决问题。事实上,很多限流操作都是针对IP进行的。例如,限流模块可以限制IP单位时间内的访问次数。但是这里还有一个问题:

在公众号顶级建筑师后台回复“清洁建筑”,即可获得惊喜礼包。

电话验证

难道没有更好的方法来预防吗?当然有。我们可以看到,近年来,几乎所有的应用都会允许用户绑定手机。一是国家实名制政策要求,二是手机与身份证基本相同,基本可以代表一个人的身份。所以很多安全操作都是基于手机验证,登录也是可以的。

1.当用户输入密码超过3次时,要求用户输入验证码(最好使用滑动验证)

2.当用户输入密码超过10次时,会弹出手机验证,用户需要使用手机验证码和密码双因素认证登录

手机验证码防刷卡是另外一个问题,这里不再展开。以后有空的时候再讲一下我们在验证码反刷方面做了什么。

伪代码如下:

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)

我们将上述方法结合起来,增加了手机验证码的验证方式,基本可以阻止相当数量的恶意攻击者。但是没有一个系统是绝对安全的,我们只能尽可能的增加攻击者的攻击成本。您可以根据自己网站的实际情况选择合适的策略。

中间人攻击?什么是中间人攻击

Man-in-the- (man-in-the-, to MITM),简单地说,在A和B的通信过程中,攻击者通过嗅探、拦截等方式获取或修改A和B的通信内容。

举个栗子:小白给小黄发了一个快递,途中要经过快递点A,小黑躲在快递点A,或者干​​脆打开一个快递点B冒充快递点A。然后我偷偷拆了小白给小黄看看里面的东西的快递。你甚至可以保留小白的快递,然后像发丝一样打包一个盒子,寄给小黄。

在登录过程中,如果攻击者嗅探到客户端向服务器发送的登录请求,就可以轻松获取用户的用户名和密码。

谷歌锁区号/谷歌邮箱老号-购买商城
谷歌play地区代改
Google Voice号码支持自助购买
谷歌锁区号购买商城]
美区VISA卡代开-可以用于aws,azure,FB,谷歌,亚马逊,速卖通,eBay,独立站,paypal等支付
如果您还有其他问题可以加我QQ交流。
QQ号:2802364971

原文链接:WEB程序时,伪代码未考虑并发,实际开发可以考虑太多,转载请注明来源!

0