博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CI -- system/libraries/Session.php
阅读量:5760 次
发布时间:2019-06-18

本文共 4055 字,大约阅读时间需要 13 分钟。

system/libraries/Session.php

CIsession类的实现机制是使用了浏览器的Cookie,如果用户禁用了Cookie,那么Session将无法使用。网上也有说CISession莫名其妙丢失的问题,所以我就直接看看代码里是怎么处理,比无谓的猜测要有意义的多。

/**     * Fetch the current session data if it exists     *     * @access    public     * @return    bool     */    function sess_read()    {        // Fetch the cookie        $session = $this->CI->input->cookie($this->sess_cookie_name); //通过Cookie获取数据        // No cookie?  Goodbye cruel world!...         if ($session === FALSE)        {            log_message('debug', 'A session cookie was not found.');            return FALSE;        }        // Decrypt the cookie data        if ($this->sess_encrypt_cookie == TRUE)        {            $session = $this->CI->encrypt->decode($session);        }        else        {
       //看这里,即使你在设置里没有使用加密,但是你必须要设一个加密秘钥,因为CI要保证从客户端Cookie获取的数据是可靠的。 // encryption was not used, so we need to check the md5 hash $hash = substr($session, strlen($session)-32); // get last 32 chars //得到Hash数值 $session = substr($session, 0, strlen($session)-32); //真正的Session内容 // Does the md5 hash match? This is to prevent manipulation of session data in userspace        //使用配置文件中给Session加密的秘钥和Session的内容,对Session进行MD5操作,并与上面得到的散列值做对比 if ($hash !== md5($session.$this->encryption_key)) { log_message('error', 'The session cookie data did not match what was expected. This could be a possible hacking attempt.'); $this->sess_destroy(); return FALSE; } } // Unserialize the session array $session = $this->_unserialize($session); // Is the session data we unserialized an array with the correct format? if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity'])) { $this->sess_destroy(); return FALSE; } // Is the session current? if (($session['last_activity'] + $this->sess_expiration) < $this->now) { $this->sess_destroy(); return FALSE; } // Does the IP Match? IP地址匹配没什么好说的 if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address()) { $this->sess_destroy(); return FALSE; } // Does the User Agent Match? 浏览器 user_agent 匹配,这里有个细节要注意下,这里只匹配从客户端获取的120个字符的数据。 if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 120))) { $this->sess_destroy(); return FALSE; } // Is there a corresponding session in the DB? 如果你的CI Session配置了使用数据库,那么会到数据库查询该记录。 if ($this->sess_use_database === TRUE) { $this->CI->db->where('session_id', $session['session_id']); if ($this->sess_match_ip == TRUE) { $this->CI->db->where('ip_address', $session['ip_address']); } if ($this->sess_match_useragent == TRUE) { $this->CI->db->where('user_agent', $session['user_agent']); } $query = $this->CI->db->get($this->sess_table_name); // No result? Kill it! if ($query->num_rows() == 0) { $this->sess_destroy(); return FALSE; } // Is there custom data? If so, add it to the main session array $row = $query->row(); if (isset($row->user_data) AND $row->user_data != '') { $custom_data = $this->_unserialize($row->user_data); if (is_array($custom_data)) { foreach ($custom_data as $key => $val) { $session[$key] = $val; } } } } // Session is valid! $this->userdata = $session; unset($session); return TRUE; }

转载地址:http://kplkx.baihongyu.com/

你可能感兴趣的文章
看雪论坛502,出现安全宝?
查看>>
华为交换机隐藏配置模式
查看>>
修改git环境默认路径 (通过设置home环境变量来设置)
查看>>
springSSM 使用poi导出excel(一)
查看>>
Json(Json-lib)中使用JSONObject.toBean(JSONObject jsonObject, Class beanClass)日期保存了当前时间...
查看>>
我的友情链接
查看>>
基于 Docker 的微服务架构实践
查看>>
TPYBoard超全DIY案例一览:轻松玩转MicroPython开发!
查看>>
Playfair密码算法Java实现
查看>>
Java学习笔记(2015.7.27~7.31)
查看>>
(二)搭建容器云管理平台笔记—安装容器化环境
查看>>
Linux命令--积累
查看>>
使用 Swagger UI 与 Swashbuckle 创建 RESTful Web API 帮助文件
查看>>
UINavigationController navigetionBar
查看>>
F5记录连接表脚本
查看>>
我的友情链接
查看>>
设计模式-工厂(抽象工厂模式)
查看>>
EL表达式遍历集合显示异常处理
查看>>
基于Krpano的Hotspot热区插件·第三版(重要升级)
查看>>
使用TMG配置×××注意事项
查看>>