【问题标题】:Best Practice - Session Handling/Timeout [closed]最佳实践 - 会话处理/超时 [关闭]
【发布时间】:2013-03-28 16:55:22
【问题描述】:

在使用 MySQL 的 C++ 服务器中处理会话和超时的最佳做法是什么。

我的 C++ 服务器生成一个会话 GUID 并将其作为 Set-Cookie 发送到客户端浏览器。

我是否应该让任何会话超时?

我应该将会话 GUID 保存在我的 MySQL 用户表中吗?

当用户做某事时,我应该更新表中的任何时间戳还是应该将会话和上次操作直接保存在 C++ 服务器中?

我应该如何处理“保持登录状态”,并且会话 GUID 永不过期? (这可能是一个很大的安全漏洞)

【问题讨论】:

    标签: c++ mysql session cookies


    【解决方案1】:

    我无法帮助您处理 C++ 部分,但这里有一些关于会话(服务器端)的提示:

    • Session对象至少应该维护

      • 上次访问(发出请求)的时间
      • 通过将当前时间与 Max Idle Time(会话被视为过期之前未进行访问的最长时间)相加来计算每次访问时的过期时间
    • 在每次访问时,将存储在 Session 对象中的过期时间与当前时间进行比较,以确定会话是否过期。如果是这种情况,则会话无效并且会话对象从会话管理器的缓存中删除。在 Web 服务器的情况下,将 302 发送回客户端并且 cookie 已过期。

    • 会话管理器可以实现会话缓存,该缓存可以在内存中,也可以保存在磁盘中。将其持久化到磁盘可在服务器重新启动的情况下提供会话恢复。缓存还可以是分布式缓存(例如 Memcache),允许集群中的多个服务器共享 Sessions 对象并提供跨服务器的负载平衡。

    【讨论】:

    • 到目前为止听起来不错,但是对于“保持登录”或更好的“记住我”处理,您会推荐什么?让这个 Session 永不过期,或者在 30 天不活动之后?
    • 有几种方法。一种是使用带有“永久”会话 ID 的“永不”过期 cookie。显然,如果客户端更改其凭据是否过期,则永久会话必须在服务器端失效。也可以在 cookie 中传递一次性共享密钥,用于重新验证会话。
    • 一次性共享机密到底是什么意思?你会怎么做?
    • 服务器端生成的唯一值,传递给客户端(通过 cookie)并在重新传递给服务器(通过 cookie 或通过 url 参数)时,唯一标识和验证客户端。会话 ID 是共享机密。如果你实现这样的事情要警惕Session Hijacking
    • 我的 Session-ID 将是一个 GUID。为了更安全,我将在特定时间后重新生成会话 ID。谢谢! :)
    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2018-07-20
    • 1970-01-01
    • 2010-09-20
    • 2010-09-07
    • 2011-05-30
    相关资源
    最近更新 更多