1. 程式人生 > >ecshop session產生和原理分析,改進

ecshop session產生和原理分析,改進

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的癱瘓。