公司项目重构-Web安全-认证和会话管理


如时间有限,可直接阅读防范手段一节。

1、背景介绍

今年开始公司准备对项目做部分重构,其中安全性问题首当其冲,除了已知的问题外,还需要发散思维,尽可能找出更多的潜在问题。期间发现一本非常好的书《白帽子讲Web安全》,感谢吴翰清大佬,读完本书让我对web安全有了更深刻的理解,强烈推荐大家阅读。

我打算记录下整个安全性重构的过程,相关知识点大部分会摘抄自《白帽子讲Web安全》,因为总结的很到位了,最后记录下公司内采用的防范手段(敏感信息不会书写)。

2、安全风险

首先需要知道”认证(authentication)“和”授权(authorization)“的区别:
-> 认证的目的是为了认出用户是谁,授权的目的为了决定用户能做什么
-> 认证实际上就是一个验证凭证的过程,常用凭证如账号密码、指纹等

认证又有”单因素认证“和“多因素认证”:只有一个凭证比如账号密码,称为单因素,同时还具备手机验证码、指纹等称为多因素认证。在用户体验上多因素会带来一些不便,可能会验证两次以上,如需要安装证书、输入短信验证码、输入支付密码等。

账号密码凭证还是目前比较普遍的做法,实现成本低、认证简单,缺点是安全性比较弱,容易被猜测,因为用户可能会输入易猜测的简单密码,因此需要有一套完善的密码方案。

认证过程攻击

这里只谈密码认证的攻击方式。除了暴力破解外,黑客常用的手段就是猜测,维护一份弱密码列表,比如123456,或尝试输入用户相关信息作为密码输入,比如出生日期、姓名拼音等。这种攻击成本很低,而且效果往往会更好。

又或者采用撞库的方式,因为很多网友都习惯使用同一密码。

认证后的Session攻击

通过密码或其他认证因素登录后,用户访问页面会携带一个凭证id,即SessionId。服务器中保存着所有在线用户的Session,客户端只要携带SessionID访问服务器即可被识别出用户身份。目前常见做法是保存在客户端Cookie中,因为Cookie会随着HTTP请求发送,并受浏览器同源策略的保护。

Session劫持
SessionID一旦在生命周期内被窃取,就等同于账户失窃,因为攻击者已不需要攻击登录过程,这种攻击方式称为Session劫持,如果SessionID保存在Cookie中则又称为Cookie劫持。其方式有很多,比如XSS攻击、网络Sniff、本地木马读取。XSS漏洞可以通过将会话Cookie设置为HttpOnly(js不可读),网络Sniff和木马只能在客户端着手解决了。

SessionID暴露
书里提到了曾经QQ的WAP邮箱的漏洞,他们是将会话id保存在URL中,没保存在Cookie中(可能以前很多手机不支持Cookie吧),那么如果故意在发送的邮箱内容中引用一张外部网站图片,借助Referer的机制,在外部网站的服务器访问日志中可以拿到Referer信息,这样sid就暴露了。
注意:有时候会不经意间犯类似这种错误,比如前后端分离后,如果前端将会话token跟在url参数后(比如有页面之间的跳转,需要传递token),就可能会被攻击者利用。一定要慎重,sid的方式我们肯定是废弃的,但也要引起注意是否可能发生同类风险。

Session Fixation攻击 和 Session保持攻击
意思是:如果登录前后的用户SessionID没有变化,则有可能存在Session Fixation问题。
比如攻击者设法将带有SessionID的地址(比如刚才讲的sid问题)发送给用户,并诱导用户打开登录,由于服务器未更新SessionID的值,导致攻击者也可以访问用户账户了。
会话保持:攻击者持有用户Se

3、防范手段

一、在用户密码方面

从用户输入密码,到程序存储密码、再到认证密码的过程中,都要严格遵守以下规范:

1、校验密码强度(重要)

在注册时,增加密码强度检测功能,并以友好的方式告知用户输入密码的强度:
在这里插入图片描述
一般项目都有自己的密码强度校验规则,OWASP推荐了一些策略方案:
密码长度上:

  • 普通应用6位以上
  • 重要应用8位以上,并考虑双因素认证

密码复杂度上:

  • 密码区分大小写字母
  • 密码为大写字母、小写字母、数字、特殊符号中两种以上的组合
  • 不要有连续性的字符,比如1234abcd等,很容易被猜测到
  • 尽量避免出现重复的字符,比如888888

除了OWASP推荐的策略外,还要注意不能使用用户公开数据作为密码或密码的部分组成,比如姓名拼音、手机号、生日等,这些信息往往都是公开的,很容易被猜测。
推荐公司根据业务场景制定自己的密码强度规范,并维护一份弱密码列表,只要是不合法要求的密码,都提示用户此密码不安全或强制让其修改。

2、不可逆的加密算法(重要)

在密码入库的时候一定不要直接保存明文密码,必须采用不可逆的加密算法(常见的加密算法有MD5或SHA-1),将加密后的密码保存到数据库中。这样内部人员也看不到用户密码,而且就算被黑客攻击也看不到。

在用户登录认证的时候,仅对用户输入的密码进行同样规则加密,再与库内保存的“密码”进行匹配是否一致即可。

防止命中彩虹表:
彩虹表:收集足够多的密码明文与密文的对应表,比如网站:www.cmd5.com
在不可逆加密算法的基础上,还要为用户设置的密码添加额外随机字符串(称为Salt)来增强复杂度,MD5(password+salt),这样可以使彩虹表攻击方式失效。Salt可以保存到服务器配置文件中或用户信息表中这样每个用户都随机生成不同的。

3、多因素认证(看业务场景)

在重要的场景下,比如支付扣款、修改重要资料时,可让其输入支付密码(非登录密码)或短信验证码来验证是否本人操作。
多因素认证能够提高攻击的门槛,攻击者必须通过所有的认证机制,比如能够成功支付的前提是,必须知道用户的登录密码和支付密码。

4、认证的超频限制(重要)

比如密码输入错误超过一定次数就冻结账号一段时间。当然了这个功能有可能会被恶意利用冻结别人账号。建议还是添加行为验证码,常见的有拖拽、点选、拼图等花样,在用户输入错误密码超过几次后强制进行验证码验证,这样也不会影响正常用户的体验。

还有其他方式,但可能会影响用户的体验。

  • 定期提醒用户修改密码,防止被撞库
  • 输入用户名,手动点击下一步才能输入密码(参考apple网站登录)
  • 增加验证码复杂度,比如12306那种,人类识别起来都费劲

二、在会话管理方面

1、会话cookie一定要设置HttpOnly(重要)

设置为httponly的Cookie,JS读取不到,可以防止由XXS引起的Cookie劫持。

2、用户客户端发生改变时,强制重新登录 (重要)

在用户登录时,将IP、User-Agent或其他标识信息也保存起来,每次请求校验这些信息与之前保存的是否一致,如果发生改变强制下线。

3、踢下线功能,每个用户只允许一个session(重要)

即只允许用户在一个客户端在线,且只允许生成一个SessionID或Token(前后端分离后的叫法)

还有其他方式:

  • 登录后,重写SessionId(即颁发新的SessionID给客户端,不是session)
  • 我们还可以整合第三方登录功能,比如微信的网页扫码授权,让网站具备了多因素认证
  • 如果场景允许的话,可以优先让用户通过短信验证码登录

单点登录
如果公司是多个团队协作开发,建议开发单点登录系统,将用户安全保障集中起来由专门团队维护。

暂时就写到这里,如有变化,会及时更新的。如有错误,请大家及时提出。
再次感谢吴翰清大佬!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值