【问题标题】:Session ID regeneration not working for concurrent requests会话 ID 重新生成不适用于并发请求
【发布时间】:2015-06-28 12:09:52
【问题描述】:

我已将这个问题发布到 CI 论坛但没有任何答案,所以我在这里尝试。

我正在将 CI 用于从单页应用程序提供 JSON 调用的 REST API。 在 CI 2.x 中,在短时间内请求“链”的情况下,会话 ID 重新生成存在问题,而其中一些请求更改了会话 ID。我希望 CI 3 及其全新的会话库能够修复它。

我升级到 3.0,仔细阅读会话文档并进行了一些测试。在我看来,CI 2.x 中出现的问题在 3.0 中仍然存在。

让我以http请求的例子来解释一下(实际上是从一个真实的应用程序中观察到的):

会话 ID 不变:

GET ... Request cookies: ci_session=123,
        Response cookies:
GET ... Request cookies: ci_session=123,
        Response cookies:
...

要重新生成会话 ID:

GET ... Request cookies: ci_session=123, 
        Response cookies: ci_session: <deleted>, ci_session: 456

这个请求比前一个返回的请求开始得早,所以它带有旧的会话 ID:

GET ... Request cookies: ci_session=123,
        Response cookies:

但会话 ID 123 不再有效,因此该请求被视为未通过身份验证。

看来,添加到新会话库中的锁定并不能阻止这一点。

我的会话配置是:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = <some path>
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 60;
$config['sess_regenerate_destroy'] = TRUE; 

我在初始请求身份验证后使用 session_write_close()。

有没有办法将 CI 3 用于这个请求之王?难道我做错了什么? 任何帮助表示赞赏。 谢谢

【问题讨论】:

    标签: php ajax session codeigniter-3


    【解决方案1】:

    首先,如果您使用会话,它不是 RESTful API,因为使用会话的全部意义在于维护状态,而 REST 服务必须是无状态的。

    话虽如此,sess_regenerate_destroy 设置正是为像您这样的用例而创建的。将其设置为布尔值 FALSE,旧的会话 ID 将在稍后被垃圾收集器删除,而不是在重新生成时立即删除。这会留下一个时间窗口,在此期间旧会话 ID 和新会话 ID 都可用,并且排队的请求不会被拒绝。

    【讨论】:

    • 谢谢纳尔夫。我希望我的问题会找到你,它确实找到了。 sess_regenerate_destroy 可能是我不太了解的会话库的唯一设置。我测试了你的建议,它似乎有效。我想知道旧会话 ID 和新会话 ID 都可用的时间窗口长度是多少。它与sess_expiration(session.php 第 303 行)的值相同吗?这是否意味着所有未被GC删除的会话文件都包含仍然可用的sess ID?就我而言,这将是几天前的文件/ID。我在这里有点困惑。谢谢!
    • Uauu,速度真快 :) 我想使用长会话(良好的用户体验)和频繁的会话 ID 再生(会话固定攻击预防)。但是,当我使用sess_regenerate_destroy=FALSE 并且用户将注销时,只有一个会话将被破坏,但许多打开的会话将等待 GC 几个小时甚至更长时间。那不安全。这让我有两个选择:1. 短 session_expiration 并且不重新生成会话 ID(用户友好度较低但更安全),2. 某种其他授权(例如 OAuth2)无论如何感谢您的回复和您为 CI 所做的工作!
    猜你喜欢
    • 2020-05-25
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多