有一个类似的问题已经问过,但没有一个提供正确的答案,所以我会更深入一些,以确保我们理解。 PHP会话存储一个服务器端会话ID,该ID将与客户端cookie中保存的会话ID进行比较,但CodeIgniter似乎不存储会话ID服务器端,如果是这样,它如何知道从中抓取的cookie客户有效且未被篡改?
我在会话库中查看了CodeIgniter的函数,它似乎没有将会话ID存储在任何地方,我不能创建自己的cookie以类似CodeIgniter并通过页面的安全性吗? 所有答案都赞赏每个人的美好时光。
答案 0 :(得分:4)
很棒的问题。
CodeIgniter会在Cookie中存储会话数据的 Serialized 值,包括session_id
,ip_address
,user_agent
,last_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`)
);
默认情况下,该表名为ci_sessions,但只要更新application / config / config.php文件以使其包含您选择的名称,您就可以将其命名为任何名称。创建数据库表后,可以在config.php文件中启用数据库选项,如下所示:
$config['sess_use_database'] = TRUE;
启用后,Session类会将会话数据存储在DB中。 确保您已在配置文件中指定了表名:
$config['sess_table_name'] = 'ci_sessions';
答案 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工作,如果更改值,则会丢失会话。现在选择是你的。