老网安的面经-技术问答-软件安全设计篇

admin 2023年12月4日02:55:24评论7 views字数 1477阅读4分55秒阅读模式

面试官:我看你简历上写着参与过很多业务系统的安全方案设计,那身份验证这款你能说说怎么设计的吗?

我:身份验证不仅仅是登录,其实注册、找回密码都是身份验证的一部分,我从一个新用户使用的流程来讲吧。用户进来首先肯定是注册,注册功能有几个特别需要注意的点:1、防止账号批量注册;2、防止用户枚举3、用户数据采集符合监管要求。

我们现在都是手机号注册,所以不太容易出现批量注册的情况。通过手机号批量注册只有一种情况,那就是验证码校验逻辑有问题。正常的逻辑是先请求短信发送接口,接口逻辑中生成一个4位或6位随机数,将随机数写入redis中,key是{mobile}_register,value是随机数的值,有效期300秒,然后将随机数发送给{mobile}。用户收到短信后,拿着验证码来和redis中的value值进行验证即可。但这里有些软件设计师没有考虑到暴力破解的问题,因为300秒足够长,现如今高并发业务服务器能处理很多请求,暴力破解6位数300秒内足够完成。暴力破解验证码的问题不仅仅是批量注册独有,其他业务场景也存在。所以要进行防暴力破解设计,通过redis的incr来计算验证失败次数,失败5次就触发锁定,等5分钟后重新发送短信验证码进行验证。

有时候业务逻辑会先判断手机号是否已经注册,然后再发送短信,这样没问题,可以减少短信成本。但不能将判断的结果返回给前端,不管手机号是否已注册,都给前端返回{"code":20001,"msg":"succss"}。如果手机号已注册,返回给前端{"code":40000,"msg":"success"},那就能通过code来枚举用户。

另外一块是关于个人信息保护法的要求,我们需要在注册页面提供隐私协议,告知采集哪些数据,作哪些用途。

当然还有一些其他的潜在风险,但这不是设计上的问题,比如SQL注入、Redos这些是由于代码没写好导致的安全问题。

面试官:为什么会有Redos呢?

我:一般我们会通过正则校验手机号,如果正则写的不对,可能会导致redos。

我:刚才我说了注册。那一个用户注册完后,就是登录了。我们现在的应用大部分都支持验证码登录也叫otp,另外就是账号+密码登录。这两者存在的问题和注册功能一样,都存在1、用户枚举2、用户数据采集符合监管要求;这2个共性问题。除此之外,用户在提交校验信息的时候,比如password字段或者code字段,为了防止黑客中间人攻击获取密码或者验证码,以及一定程度缓解暴力破解,应该对password和code字段做前端加密,然后在post给后端进行解密。没有特殊要求,我一般建议用Aes256

面试官: 你用了aes在前端加密,那黑客可以在js中找到密钥信息,那还不是等于没做加密吗?

我:你说的这种情况是针对于黑客抓包想要还原真实数据,或者想要暴力破解。但中间人获取明文密码或者验证码的问题是得到有效的解决了。如果黑客要想暴力破解,那就需要去js找到加密算法,密钥,iv,加密模式等信息,这些可以通过混淆的方式打乱。

我:找回密码和注册、登录存在一样的共性问题:1、用户枚举2、暴力破解。有些找回密码是通过验证短信验证码,有些是直接给邮箱发一个重置密码的链接。前者的问题主要还是验证码暴力破解的问题,后者可能会有host注入导致重置链接中的凭证泄露。

下一篇:老网安的面经-技术文档-数据脱敏篇

各位看官老爷,本人新建了一个知识星球,会更多的文章、学习资料、工具发在星球上。100块买不了吃亏买不了上当!

老网安的面经-技术问答-软件安全设计篇


原文始发于微信公众号(信息安全笔记):老网安的面经-技术问答-软件安全设计篇

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月4日02:55:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   老网安的面经-技术问答-软件安全设计篇https://cn-sec.com/archives/2262897.html

发表评论

匿名网友 填写信息