会话绝对超时应该多长时间?

信息安全 验证 Web应用程序 会话管理
2021-08-15 06:10:14

OWASP 会话管理备忘单 ( https://www.owasp.org/index.php/Session_Management_Cheat_Sheet ) 建议实现绝对会话超时(除了空闲会话超时)。这意味着无论会话活动如何,应用程序都会强制用户重新进行身份验证。

是否有任何关于超时持续时间的建议,以确保足够安全且不会惹恼最终用户?将绝对会话超时设置为 24 小时就足够了吗?更多的?

我正在处理的应用程序将放置在内部公司网络中,并由用户用于执行他们的日常工作职责,因此频繁的重新身份验证请求可能是一个可用性问题。

2个回答

时间长度没有严格的答案。空闲超时的限制取决于法规和可能的管辖法律。

PCI DSS 3.1 中对持卡人数据的基于会话的访问必须是“合理的”。第 8.1.8 项中的 PCI DSS 3.1 对此提供了具体指导

8.1.8 如果会话空闲超过15分钟,要求用户重新认证以重新激活终端或会话。

资料来源:https ://www.pcisecuritystandards.org/documents/PCI_DSS_v3-1.pdf

其他合规计划也存在类似的建议。根据数据敏感性上下文使其可配置和灵活可能是您最好的选择。

在我所知道的任何框架下都没有强制要求绝对超时,但它们看起来确实很有趣。用户体验影响可能很重要,但限制会话劫持持续时间的好处也很重要。这似乎是一个更好的解决方案 - 如果您控制应用程序代码 - 将是会话轮换(即:OWASP 术语中的更新超时),应用程序会定期生成一个新的会话 ID。

如果应用程序允许并且使用不超过 1 小时的续订超时,我建议进行续订超时。这大大降低了劫持风险,并且对于任何具有直接(小型且可手动复制)或可序列化会话状态的应用程序都应该是实用的。

如果绝对超时是您唯一的选择,我会将超时设为 24 小时。这是一个合理的限制,限制了惊喜。多天的绝对超时可能会使用户感到困惑,因为他们会将重新提示视为任意或可能表明应用程序失败。

24 小时可能太多了,24 分钟是 PHP 会话 (session.gc_maxlifetime) 的默认值,但会话在此时间之后过期的概率只有 1% (session.gc_divisor)。

您必须将垃圾收集的除数设置为 1,然后为 100%。

https://stackoverflow.com/questions/156712/php-what-is-the-default-lifetime-of-a-session

您必须检查会话和垃圾收集在您使用的服务器端语言中的工作方式。

当浏览器关闭时,会话也会关闭,并且很可能会从垃圾收集中删除。

备忘单中有明确的建议:

Common idle timeouts ranges are 2-5 minutes for high-value applications and 15- 30 minutes for low risk applications.

但请记住,当垃圾收集不会确定(除数)删除会话时,会话不会在 24 分钟后自动结束。

当用户处于活动状态时,您始终可以在代码中恢复会话并延长其生命周期。如果用户在特定时间内未处于活动状态,则让会话过期并将其删除。

但是单个会话应该尽可能短,并且意味着到期。

https://stackoverflow.com/a/8843033/753676