牛骨文教育服务平台(让学习变的简单)
博文笔记

ecshop session产生和原理分析,改进

创建时间:2016-07-07 投稿人: 浏览次数:2175

ecshop中的session和默认的session机制是不一样的。ecshop的session是自己定义的。ecshop的session原理他是基于cookie和ip综合处理生成的随即session字符串的。ecshop的session就是当你建立一次会话之后,就会通过cookie和ip综合运算形成随即的session_id。从而存储在session表中。

   1:ecshop的session建立。

    当我们请求ecshop页面,那么就会建立个session,通过includes/init.php初始化 $sess = new cls_session($db, $ecs->table("sessions"), $ecs->table("sessions_data"));

$sess就是新的session对象。

    define("SESS_ID", $sess->get_session_id()),在session的类中。 $GLOBALS["_SESSION"] = array();就是初始化session全局变量,$this->_ip = real_ip();这个就是决定了session和ip有关。所以很多时候,在不同的浏览器下面,会造成session丢失。这个时候我们就该考虑到会因为IP引起ecshop session的异常。

   

 function gen_session_key($session_id)
    {
        static $ip = "";
        if ($ip == "")
        {
            //$ip = substr($this->_ip, 0, strrpos($this->_ip, "."));
        }
        return sprintf("%08x", crc32(!empty($_SERVER["HTTP_USER_AGENT"]) ? $_SERVER["HTTP_USER_AGENT"] . ROOT_PATH . $ip . $session_id : ROOT_PATH . $ip . $session_id));
    }

     因为session产生的时候,和IP有关。

   2:正是因为ecshop的session是存储在数据库中的。而且每次初始化session,都会写入一次ecshop数据库到session表。

   

 function insert_session()
    {
        return $this->db->query("INSERT INTO " . $this->session_table . " (sesskey, expiry, ip, data) VALUES ("" . $this->session_id . "", "". $this->_time ."", "". $this->_ip ."", "a:0:{}")");
    }


 

   我们看到以上代码,根本就没做任何的处理,就直接将ecshop的session写入到了数据库。通过这个代码,我们就可以想到攻击ecshop最简单的办法,通过一个IP不断的请求服务器,那么该session表很快就能出现异常,如果ecshop session是内存表,和容易就写满了。造成ecshop的瘫痪。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。