使用PHP / CodeIgniter中的重新生成会话ID

时间:2011-02-04 14:13:28

标签: php session codeigniter security

我正在使用CodeIgniter的Session类来管理购物车/结帐系统的会话。会话数据存储在数据库中,会话ID存储在cookie中。所有购物车信息都通过AJAX检索,并与会话ID一起保存在会话中。

现在我正在使用PHP / CodeIgniter生成的会话ID来跟踪用户。用户不登录到站点,并且商店和购物车/结账系统位于不同的域中,因此这是将它们绑定到存储在会话/数据库中的购物车的唯一事物。我在表单上的隐藏字段中使用此会话ID,并将其作为链接中的参数使用,以便在任何请求时将其发送到服务器(添加项目,删除项目,查看购物车等等)

CodeIgniter允许您设置重新生成会话ID的时间,现在我将其设置为10分钟。我在默认情况下使用它但是时间太短,因为如果用户在页面上停留的时间太长,则动态写入链接和表单的会话ID将过时并且不再与其购物车数据相关联。< / p>

这显然不是一个很好的解决方案。允许以较低的间隔重新生成会话ID的最佳方法是什么,但即使用户等待10分钟以上(没有页面刷新)来执行操作,仍然会将用户与其购物车数据挂钩?

1 个答案:

答案 0 :(得分:8)

不要在数据库中使用会话ID。购物车应该跨会话持续存在,因此您需要将购物车存储在与用户相关的位置,而不是会话中。我也不会将会话ID作为隐藏字段放在字段中。会话的好处是您可以将它们存储在服务器端。

将购物车存放在数据库中,不要将整个内容加载到会话中。

方法#1

可以在数据库中为用户提供“活动”购物车。

User -> (has many) Cart

然后通过向其添加项目来更新此购物车

/cart/add/{id}        -> Verify prices / quantities

此购物车未链接到会话,会话仅控制用户登录。当他们结帐时,购物车从“有效”设置为“已订购”,而新的“有效”(但空)购物车是创建。购物车将在会话之间保留在数据库中,并且可以提供完整的历史记录。

方法#2

将整个购物车存储在会话中,而不是对数据库进行备份。这会使一些事情变得更简单(添加/删除项目不是数据库操作),但它也不会在会话中持续存在。当用户签出时将购物车写入数据库。