我正在开发的一个遗留应用程序让用户填写大量问题,并在调查问卷的最后批量保存答案。该过程很漫长,并且典型的用户可能会在某个时刻经历超时。
该团队提出了通过无休止的会话来绕过这个问题的想法。经过一番谷歌搜索后,我发现很多文章解释了如何增加超时;但是我没有看到揭露这种做法风险的文章。乍一看,我觉得设置超时是合理的。
我的问题是:
主要风险是,如果会话标识符永不过期,它实际上就会成为密码。任何有权访问会话标识符的人都可以离线记录此信息,然后在稍后使用此信息登录应用程序。例如,某人可以通过短暂访问用户的计算机来从 cookie 复制会话令牌。
缓解这种情况的方法是定期轮换会话标识符。也许您可以有一个 AJAX 请求,每 10 分钟触发一次并获取当前会话的新令牌 - 即使使用标准会话过期时间(例如 10-20 分钟),这也足以使会话保持活动状态提交表单之前不会超时。
暴力破解不是问题:只要会话标识符具有足够的熵,那么被暴力破解的风险就很小。此处提供了关于选择强大的会话标识符生成方法的 OWASP 指南。
性能方面比安全方面更重要的是,如果您在每个会话的内存中存储对象,那么随着会话数量的增加,最终内存将被填满。
长会话的另一个风险是任何 CSRF 或 XSS 漏洞都有很长的暴露时间可供利用。如果用户访问针对您的应用程序的恶意站点,较短的会话超时将减轻任何攻击,因为用户将无法通过身份验证。即使使用持久登录,如果您拥有长期“刷新令牌”和短期(即会话)“访问令牌”,如果您的站点被充分锁定(例如,它只允许具有 CSRF 保护本身的请求将刷新令牌交换为访问令牌)。
例如,如果存在 CSRF 漏洞:
[User] --> [Attacker's Site] --> [Your site]
Browser --> Malicious Page builds form for your site --> Submits form via AJAX
Run Code Online (Sandbox Code Playgroud)
由于无休止的会话超时,如果用户曾经使用浏览器访问过您的网站,则这种攻击就会成功。
但是,如果您有两个会话令牌:刷新令牌和访问令牌,并且您需要访问令牌才能提交表单,这将防止攻击。由于访问令牌只能通过同一站点请求检索,因此确保该请求的处理程序针对 CSRF 得到充分保护,可以减轻站点上可能存在的其他漏洞。
因此,如果您必须使会话无限,请使用必须交换的不同令牌才能对您的网站进行身份验证。请参阅这篇文章,了解如何实现“记住我”功能(也称为我们的刷新令牌)。缺点是您必须自己实现刷新令牌来访问令牌逻辑,并要求用户必须使用访问令牌再次重新发送任何请求(可以使用 JavaScript 的客户端逻辑来实现)。
| 归档时间: |
|
| 查看次数: |
1519 次 |
| 最近记录: |