4

我来自安全背景,我是一名信息安全顾问,并测试了 web 应用程序的漏洞。我刚开始从事 webdev 工作,我正忙于我的第一个项目,用 Codeigniter 编写。

我正在尝试解决多个并发登录的问题,其中用户可以有两个(或更多)同时有效且活动的并发会话。我知道如何做到这一点,但我对 CI 没有经验,所以我想知道是否有更好或更“官方”的方式。它还涉及对数据库的 ci_sessions 表进行更改,不确定 CI 将如何处理它。

目前我正在使用数据库进行会话数据,我的计划是在 ci_sessions 表中添加一个额外的 coloum,该表存储用户的电子邮件地址(身份验证后)。换句话说,在用户成功登录之前它将为 NULL,此时用户的电子邮件地址将被存储在其中。

计划是确认登录期间提供的凭据的有效性,如果它们正确,则在会话表中搜索与同一电子邮件地址对应的其他会话并删除它们。删除用户的其他会话后,将设置指示有效已验证会话的电子邮件和会话数据。

这是最好的方法吗?

编辑:当然,当 CI 为当前会话创建新会话 id 而不是更新时,这将不起作用,因为 CI 不会将电子邮件地址设置为新会话。我必须对源代码进行修改...

4

3 回答 3

2

我正在查看 Sessions.php 的源代码,并在 sess_update() 的末尾找到了这一行,只有在使用 DB 会话时才会调用它:

$this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));

换句话说,当前 session_id 用新的 session_id 更新,而不是插入新条目,而保留所有其他信息(除了 last_activity)不变。然后我决定尝试我原来的计划,我在默认为 NULL 的表(而不是电子邮件)中添加了一个 user_id 列。登录时,我检查凭据并返回(除其他外)指定电子邮件地址的 user_id。然后,我删除 user_id 列中具有该特定 ID 的所有会话,并更新与当前 session_id 关联的行以包含该用户的 user_id。

我已经通过使用 Chrome 登录然后使用 Safari 进行了测试,并且 Chrome 会话被终止。我仍然需要进行更多测试以确保没有漏洞,但看起来这解决了我的问题。

非常感谢您的建议。Samutz,我相信你的方法会奏效,我只是发现我的开销更少。

于 2013-04-18T19:58:02.697 回答
0

这是我在我的一个应用程序上执行此操作的方式:

在您的用户表中创建一个 session_id 字段。成功用户登录后,生成一个新的、唯一的 session_id。

(不要为此使用 CI 的 session_id,因为尽管会话相同,但它可能会根据您的会话配置而改变。想法是拥有自己的 id,只要会话存在,它就会持续存在。)

将新的 session_id 存储在用户的记录和会话数据中。在使用活动会话重复访问时,检查用户记录中的匹配 id。

现在,当该用户从另一台计算机登录时,他们将获得一个具有新 ID 的新会话,并在用户记录中更新他们的 ID。旧计算机将在下一页加载时注销,因为该计算机的会话 ID 与其用户记录中的会话 ID 不匹配。

虽然我没有将会话存储在我的数据库中(无法让它工作,所以我使用加密的会话 cookie),所以如果你将会话存储在数据库中,我不知道这将如何工作。

于 2013-04-18T19:07:57.077 回答
0

在你的配置文件中设置:

$config['sess_match_ip'] = true;

读取会话数据时会匹配用户的IP地址

参考http://ellislab.com/codeigniter/user-guide/libraries/sessions.html

希望能帮助到你!

于 2013-04-18T16:49:09.990 回答