CodeIgniter如何验证会话数据?

时间:2014-02-11 05:45:08

标签: php codeigniter session cookies codeigniter-2

有一个类似的问题已经问过,但没有一个提供正确的答案,所以我会更深入一些,以确保我们理解。 PHP会话存储一个服务器端会话ID,该ID将与客户端cookie中保存的会话ID进行比较,但CodeIgniter似乎不存储会话ID服务器端,如果是这样,它如何知道从中抓取的cookie客户有效且未被篡改?

我在会话库中查看了CodeIgniter的函数,它似乎没有将会话ID存储在任何地方,我不能创建自己的cookie以类似CodeIgniter并通过页面的安全性吗? 所有答案都赞赏每个人的美好时光。

3 个答案:

答案 0 :(得分:4)

很棒的问题。

CodeIgniter会在Cookie中存储会话数据的 Serialized 值,包括session_idip_addressuser_agentlast_activity

  

它如何知道从客户端抓取的cookie是有效的   没被篡改?

为了验证会话并提高安全性,CodeIgniter提供了set of configs,允许您检查客户端user agent和/或IP address

$config['sess_encrypt_cookie']  = FALSE;
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
  • sess_encrypt_cookie允许您加密序列化会话,然后再存储在Cookie中。
  • sess_match_ip 在阅读会话数据时匹配客户端的IP。
  • sess_match_useragent 在阅读会话数据时匹配用户代理。
  

我不能只创建自己的cookie以类似CodeIgniter而去   通过页面的安全性?

首先,如果启用sess_encrypt_cookie配置,(在config.php文件中设置encryption key时)CodeIgniter将使用您自己的加密密钥加密序列化会话数据并存储cookie中加密的数据。

因此,客户端无法更改变量。

对于其他两个配置,通过启用它们,CodeIgniter会尝试通过与会话数据进行比较来验证客户端的用户代理和/或 IP地址如果不匹配CI will removes the entire Session

将会话存储到数据库

通过使用此功能,CodeIgniter将以上所有会话数据包括 user_data存储到数据库中。并且它不会再将user_data存储在cookie中。

这将解决cookie存储限制问题(您可以在cookie中存储最多4KB)并保护user_data信息不被篡改。

答案 1 :(得分:0)

您可以在数据库中存储会话。如果您想这样做,请执行以下操作:

在数据库中创建会话表:

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
    session_id varchar(40) DEFAULT '0' NOT NULL,
    ip_address varchar(45) DEFAULT '0' NOT NULL,
    user_agent varchar(120) NOT NULL,
    last_activity int(10) unsigned DEFAULT 0 NOT NULL,
    user_data text NOT NULL,
    PRIMARY KEY (session_id),
    KEY `last_activity_idx` (`last_activity`)
);

更新Config.php文件

默认情况下,该表名为ci_sessions,但只要更新application / config / config.php文件以使其包含您选择的名称,您就可以将其命名为任何名称。创建数据库表后,可以在config.php文件中启用数据库选项,如下所示:

$config['sess_use_database'] = TRUE;

启用后,Session类会将会话数据存储在DB中。 确保您已在配置文件中指定了表名:

$config['sess_table_name'] = 'ci_sessions';

参考:CodeIgniter Document

答案 2 :(得分:0)

是的,没有检查你是否只使用cookie,cookie作为存储来存储浏览器和php之间的会话 参数$config['sess_cookie_name'] = 'ci_session';表示cookie的名称,它只是一个随机值,因此您可以使用值甚至修改来执行任何操作。

但是,如果您设置$config['sess_encrypt_cookie'] = TRUE;,则使用$config['encryption_key'] = 'XYZ';加密您的Cookie,以确保其安全,并操纵Cookie,您必须使用相同的加密密钥解密/加密Cookie。

因此,最佳做法是使用数据库会话将会话存储在数据库中,并将cookie作为会话ID工作,如果更改值,则会丢失会话。现在选择是你的。