Codeigniter和多个并发登录

时间:2013-04-18 16:38:45

标签: codeigniter security session login

我来自安全背景,我是一名信息安全顾问,并测试了网络应用程序的漏洞。我刚刚开始以webdev的身份工作,而且我正在忙于第一个用Codeigniter编写的项目。

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

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

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

这是最好的方法吗?

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

3 个答案:

答案 0 :(得分:1)

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

$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除外)保持不变。然后我决定尝试我的原始计划,我在表(而不是电子邮件)中添加了一个user_id列,默认为NULL。登录时,我检查凭据并返回(以及其他)指定的电子邮件地址的user_id。然后,我删除user_id列中具有该特定id的所有会话,并更新与当前session_id相关联的行以包含该用户的user_id。

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

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

答案 1 :(得分:0)

在配置文件中设置:

$config['sess_match_ip'] = true;

在读取会话数据时,它将匹配用户的IP地址

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

希望它有所帮助!

答案 2 :(得分:0)

以下是我在其中一个应用上执行此操作的方式:

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

(不要使用CI的session_id,因为它可以改变,尽管会话是相同的,具体取决于你的会话配置。想法是让你自己的id持续,只要会话存在。)

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

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

虽然我没有将会话存储在我的数据库中(无法使其工作,因此我使用加密的会话cookie),所以如果您在数据库中存储会话,我不知道这将如何工作。 / p>