当前位置: 首页 > 科技观察

8年的开发,连登录界面都写的这么烂,,

时间:2023-03-11 23:37:51 科技观察

前言学写程序的时候,第一行代码就是helloworld。但是当你开始学习WEB后台技术的时候,很多人的第一个功能就是写登录(小声说:别人我不知道,反正我是)。但是,当我采访或与很多工作经验相对较短的同学交流时,我发现,虽然很多同学在简历上写着自己负责项目的登录/注册功能模块的开发设计,但他们都只是简单的意识到功能。逻辑,在安全方面没有太多考虑。本文主要是和大家聊聊。在设计一个登录界面的时候,不仅仅是功能的实现,在安全性方面我们也需要考虑。安全隐患暴力破解!只要网站暴露在公网上,就很有可能被人盯上。试试这种简单有效的爆破方式:通过各种方式获取网站用户名后,编写程序遍历所有可能的密码,直到找到正确的密码伪代码如下:#密码字典password_dict=[]#登录界面login_url=''defattack(username):forpasswordinpassword_dict:data={'username':username,'password':password}content=requests.post(login_url,data).content.decode('utf-8')if'loginsuccess'incontent:print('gotit!passwordis:%s'%password)作者:哒哒哒类型码链接:https://juejin.cn/post/6859214952704999438来源:掘金版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。那么我们如何防止这种情况发生呢?验证码里聪明的同学想到了。我可以在密码错误达到一定次数时增加验证码验证!比如我们设置,当用户密码错误达到3次时,用户需要输入图片验证码才能继续登录操作:伪代码如下:fail_count=get_from_redis(fail_username)iffail_count>=3:ifcaptchaisNone:returnererror('需要验证码')check_captcha(captcha)success=do_login(username,password)ifnotsuccess:set_redis(fail_username,fail_count+1)伪代码没有考虑并发,实际开发可以考虑加锁。这样确实可以过滤掉一些非法攻击,但是以现在的OCR技术,普通的图片验证码确实很难有效的防止机器人(我们在这上面吃了不少苦头)。当然,我们也可以花钱购买第三方公司提供的滑动验证等验证方案,但都不是100%安全,是可以被破解的(惨痛的教训)。登录限制这时另一个同学说我可以直接限制异常用户的登录操作。当密码错误达到一定次数后,将直接拒绝用户登录,并在一段时间后恢复。比如我们设置一个账号登录错误10次,那么该账号的所有登录操作都会在5分钟内被拒绝。伪代码如下:fail_count=get_from_redis(fail_username)locked=get_from_redis(lock_username)iflocked:returnerror('loginrefused')iffail_count>=3:ifcaptchaisNone:returnerror('需要验证码')check_captcha(captcha)success=do_login(username,password)ifnotsuccess:set_redis(fail_username,fail_count+1)iffail_count+1>=10:#Failedmorethan10times,setthelockflagset_redis(lock_username,true,300s)umm,这个确实可以解决user的问题密码被爆破。但是这样会带来另外一个风险:虽然攻击者无法获取网站的用户信息,但是可以阻止我们网站的所有用户登录!攻击者只需无限循环遍历所有用户名即可(即使没有,随机登录的话,这些用户也会被永久锁定,导致正常用户无法登录网站!IP限制,自直接针对用户名是不行的,我们可以对IP进行处理,直接屏蔽攻击者的IP,就万事大吉了,我们可以设置当某个IP下调用登录界面的错误次数达到一定的时候number,禁止该IP进行登录操作,伪代码如下:ip=request['IP']fail_count=get_from_redis(fail_ip)iffail_count>10:returnerror('loginrefused')#otherlogic#dosomething()success=do_login(username,password)ifnotsuccess:set_redis(fail_ip,true,300s)也能一定程度上解决问题,其实很多限流操作都是对IP进行的,比如niginx的限流模块可以限制单位时间内某个IP的访问次数。但是这里也存在问题:比如现在很多学校和公司都使用同一个出口IP。如果直接通过IP限制,可能会误杀其他正常用户。现在这么多,攻击者可以在封IP后转而攻击手机。验证一下有没有更好的办法来预防? 当然有。 我们可以看到,近几年几乎所有的应用都会让用户绑定手机。一是国家实名制的要求,二是手机基本上和身份证一样,基本可以代表一个人的身份被识别。所以很多安全操作都是基于手机验证,登录也是可以的。当用户输入密码超过3次时,要求用户输入验证码(最好使用滑动验证)。当用户输入密码超过10次时,弹出手机验证,要求用户使用手机验证码和密码双重认证登录手机验证码防刷又是一个问题,这将这里就不展开了,以后有时间再说说我们在验证码防刷领域做了什么。伪代码如下:fail_count=get_from_redis(fail_username)iffail_count>3:ifcaptchaisNone:returnerror('需要验证码')check_captcha(captcha)iffail_count>10:#超过10次,使用验证码和密码登录inifdynamic_codeisNone:returnerror('请输入手机验证码')ifnotvalidate_dynamic_code(username,dynamic_code):delete_dynamic_code(username)returnerror('手机验证码错误')success=do_login(username,password,dynamic_code)ifnotsuccess:set_redis(fail_username,fail_count+1)我们结合上面的同时,加入手机验证码的验证方式,基本上可以防止相当数量的恶意攻击者。但是没有一个系统是绝对安全的,我们只能尽可能地增加攻击者的攻击成本。您可以根据自己网站的实际情况选择合适的策略。中间人攻击?什么是中间人攻击?通过拦截等方式获取或修改A、B的通讯内容。举个栗子:小白给小黄发快递,途中经过A快递点,小黑躲在A快递点,或者干脆开个B快递点冒充A快递点,然后偷偷开小白的快递给小黄看里面的东西。甚至可以留着小白的快递,然后装个一毛钱一样的盒子,寄给小黄。在登录过程中,如果攻击者嗅探客户端向服务器发送的登录请求,就可以轻松获取用户的用户名和密码。HTTPS防止中间人攻击最简单有效的操作就是替换HTTPS,修改网站所有HTTP请求,强制使用HTTPS。***为什么HTTPS可以防止中间人攻击?***HTTPS实际上是在HTTP和TCP协议之间加入了SSL/TLS协议来保证数据传输的安全。与HTTP相比,HTTPS主要有以下特点:内容加密数据完整性认证HTTPS的具体原理这里不再展开。可以自行谷歌加密传输。除了HTTPS,我们还可以手动加密敏感数据。加密传输:可以在客户端使用非对称加密对用户名进行加密,服务器端解密后的密码在客户端进行MD5后传输,防止密码明文泄露,如:操作日志,用户每次登录和敏感操作都需要记录日志(包括IP,设备等)异常操作或登录提醒,有了上面的操作日志,我们就可以根据log,比如用户登录很差,修改密码,登录异常,可以发短信提醒用户拒绝弱密码注册或者修改密码,不允许用户设置弱密码防止用户名被遍历的密码。有些网站是输入用户名后注册的,会提示用户名是否存在。这样会有网站用户名全部泄露的风险(遍历界面即可),需要限制交互或者逻辑……后记现在国家不断出台各种法律,用户数据变得越来越重要。作为开发者,我们还需要做更多的工作来保护用户数据和用户隐私。后面也会跟大家聊一聊我们在数据安全方面都做了哪些工作,希望能给大家一点帮助。作者:达达达代码链接:https://juejin.cn/post/6859214952704999438来源:掘金版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。