Php 会话ID重新生成不适用于并发请求

Php 会话ID重新生成不适用于并发请求,php,ajax,session,codeigniter-3,Php,Ajax,Session,Codeigniter 3,我已经在CI论坛上发布了这个问题,但是没有任何答案,所以我在这里尝试 我正在使用CI作为RESTAPI,从单页应用程序提供JSON调用。 对于CI 2.x,在短时间内出现请求“链”,而其中一些请求更改了会话ID的情况下,我在会话ID重新生成方面遇到了问题。我希望CI 3及其全新的会话库能够解决这个问题 我升级到3.0,仔细阅读会话文档并做了一些测试。在我看来,CI 2.x中出现的问题仍然存在于3.0中 让我用一个http请求的例子来解释它(实际上是从一个真实的应用程序中观察到的): 会话ID未更

我已经在CI论坛上发布了这个问题,但是没有任何答案,所以我在这里尝试

我正在使用CI作为RESTAPI,从单页应用程序提供JSON调用。 对于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 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; 
$config['sess_driver']='files';
$config['sess_cookie_name']='ci_session';
$config['sess_expiration']=7200;
$config['sess\u save\u path']=
$config['sess\u match\u ip']=FALSE;
$config['sess\u time\u to\u update']=60;
$config['sess\u regenerate\u destroy']=TRUE;
在初始请求身份验证之后,我正在使用session_write_close()

有没有一种方法可以使用CI 3来处理这个请求之王?我做错什么了吗? 感谢您的帮助。
谢谢

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


也就是说,
sess\u regenerate\u destroy
设置完全是为您这样的用例创建的。将其设置为boolean FALSE,旧会话ID将在稍后由垃圾收集器删除,而不是在重新生成时立即删除。这就留下了一个时间窗口,在此期间新旧会话ID都可用,排队的请求不会被拒绝。

谢谢你。我希望我的问题能找到你,果然找到了。
sess\u regenate\u destroy
可能是会话库中唯一我不太了解的设置。我测试了你的建议,它似乎起作用了。我想知道当新旧会话ID都可用时,时间窗口的长度是多少。它的值是否与sess_expiration(session.php第303行)的值相同?。这是否意味着所有未被GC删除的会话文件都包含仍然可用的sess ID?在我的情况下,它将是几天以前的文件/ID。我在这里有点困惑。非常感谢。Uauu,多快的速度:)我想使用长会话(良好的用户体验)和频繁的会话ID再生(会话固定攻击预防)。然而,当我使用sess\u regenate\u destroy=FALSE时,一个用户将注销,只有一个会话将被销毁,但许多打开的会话将等待GC几个小时甚至更长时间。那不安全。这让我有两个选择:1。短
会话\u过期
且无会话ID重新生成(用户友好度较低,但更安全),2。某种其他授权(例如OAuth2)感谢您的回复和您为CI所做的工作!
$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;