【问题标题】:How Does CodeIgniter Verify Session Data?CodeIgniter 如何验证会话数据?
【发布时间】:2014-02-11 05:45:07
【问题描述】:

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

我在会话库中查看了 CodeIgniter 的函数,它似乎没有在任何地方存储会话 ID,我不能创建自己的 cookie 来类似于 CodeIgniter 并检查页面的安全性吗? 所有的答案都感谢大家美好的一天。

【问题讨论】:

  • 你问的是 2.* 还是 3.0 ? Cuz 3.0 完全改得更好,因为 2.* 只是在会话方面做错了

标签: php codeigniter session cookies codeigniter-2


【解决方案1】:

很好的问题。

CodeIgniter 将会话数据的 Serialized 值存储在 cookie 中,包括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 将使用您自己的加密密钥加密序列化的会话数据并将加密数据存储在饼干。

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

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

将会话存储到数据库中

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

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

【讨论】:

  • 对不起,我还不能投票。很棒的答案,非常彻底。希望这能像我一样帮助某人理解如何更好地使用 CodeIgniter 中的会话,因为正如您所指出的,默认值并不安全。感谢您的出色回答。
  • @stacker 很高兴,别提了 :)
【解决方案2】:

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

在数据库中创建会话表:

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 类将在数据库中存储会话数据。 确保您在配置文件中也指定了表名:

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

参考:CodeIgniter Document

【讨论】:

  • 感谢您的回复,但这与我的要求无关!回答前请阅读。
【解决方案3】:

是的,不检查您是否仅使用 cookie,cookie 用作存储浏览器和 php 之间的会话的存储 参数$config['sess_cookie_name'] = 'ci_session';表示cookie的名称,它只是一个随机值,所以你可以随意修改这个值。

但是,如果您设置$config['sess_encrypt_cookie'] = TRUE;,它会使用$config['encryption_key'] = 'XYZ'; 加密您的 cookie,这会使其安全,并且要操作 cookie,您必须使用相同的加密密钥解密/加密 cookie。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2016-05-28
    • 2011-01-05
    • 2012-07-12
    相关资源
    最近更新 更多