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