itRef.cn技术参考网站

当前位置: 主页 > PHP >

codeigniter(CI)兼容swfupload的完美解决方法

时间:2013-09-05 11:21来源:未知 作者:wiwi 点击:
问题描述: 由于codeigniter (CI)框架的中session部是使用cookie实现的,与php原生的session不兼容,导致与swfupload等flash上传控件不兼容的问题众所周知。但网上给出的修改配置文件,全局取消session useragent的判断,降低session的安全性。下面给出的方

问题描述:

由于codeigniter (CI)框架的中session部是使用cookie实现的,与php原生的session不兼容,导致与swfupload等flash上传控件不兼容的问题众所周知。但网上给出的修改配置文件,全局取消session useragent的判断,降低session的安全性。下面给出的方法虽然也是取消useragent的判断,但不用修改配置文件,影响整个项目的session安全性。

解决方法:

在application/libraries目录下新增MY_Session.php扩展原来框架的session中的sess_read方法

 

  1. <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
  2.  
  3. class MY_Session extends CI_Session { 
  4.  
  5.     public function __construct($params = array()) 
  6.     { 
  7.         parent::__construct(); 
  8.     } 
  9.  
  10.     function sess_read($cookie
  11.     { 
  12.         // Fetch the cookie 
  13.         $session = $cookie$cookie : $this->CI->input->cookie($this->sess_cookie_name); 
  14.  
  15.         // No cookie?  Goodbye cruel world!... 
  16.         if ($session === FALSE) 
  17.         { 
  18.             log_message('debug''A session cookie was not found.'); 
  19.             return FALSE; 
  20.         } 
  21.  
  22.         // Decrypt the cookie data 
  23.         if ($this->sess_encrypt_cookie == TRUE) 
  24.         { 
  25.             $session = $this->CI->encrypt->decode($session); 
  26.         } 
  27.         else 
  28.         { 
  29.             // encryption was not used, so we need to check the md5 hash 
  30.             $hash    = substr($sessionstrlen($session)-32); // get last 32 chars 
  31.             $session = substr($session, 0, strlen($session)-32); 
  32.  
  33.             // Does the md5 hash match?  This is to prevent manipulation of session data in userspace 
  34.             if ($hash !==  md5($session.$this->encryption_key)) 
  35.             { 
  36.                 log_message('error''The session cookie data did not match what was expected. This could be a possible hacking attempt.'); 
  37.                 $this->sess_destroy(); 
  38.                 return FALSE; 
  39.             } 
  40.         } 
  41.  
  42.         // Unserialize the session array 
  43.         $session = $this->_unserialize($session); 
  44.  
  45.         // Is the session data we unserialized an array with the correct format? 
  46.         if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity'])) 
  47.         { 
  48.             $this->sess_destroy(); 
  49.             return FALSE; 
  50.         } 
  51.  
  52.         // Is the session current? 
  53.         if (($session['last_activity'] + $this->sess_expiration) < $this->now) 
  54.         { 
  55.             $this->sess_destroy(); 
  56.             return FALSE; 
  57.         } 
  58.  
  59.         // Does the IP Match? 
  60.         if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address()) 
  61.         { 
  62.             $this->sess_destroy(); 
  63.             return FALSE; 
  64.         } 
  65.  
  66.         // Does the User Agent Match? 
  67.         if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 120))) 
  68.         { 
  69.             $this->sess_destroy(); 
  70.             return FALSE; 
  71.         } 
  72.  
  73.         // Is there a corresponding session in the DB? 
  74.         if ($this->sess_use_database === TRUE) 
  75.         { 
  76.             $this->CI->db->where('session_id'$session['session_id']); 
  77.  
  78.             if ($this->sess_match_ip == TRUE) 
  79.             { 
  80.                 $this->CI->db->where('ip_address'$session['ip_address']); 
  81.             } 
  82.  
  83.             if ($this->sess_match_useragent == TRUE) 
  84.             { 
  85.                 $this->CI->db->where('user_agent'$session['user_agent']); 
  86.             } 
  87.  
  88.             $query = $this->CI->db->get($this->sess_table_name); 
  89.  
  90.             // No result?  Kill it! 
  91.             if ($query->num_rows() == 0) 
  92.             { 
  93.                 $this->sess_destroy(); 
  94.                 return FALSE; 
  95.             } 
  96.  
  97.             // Is there custom data?  If so, add it to the main session array 
  98.             $row = $query->row(); 
  99.             if (isset($row->user_data) AND $row->user_data != ''
  100.             { 
  101.                 $custom_data = $this->_unserialize($row->user_data); 
  102.  
  103.                 if (is_array($custom_data)) 
  104.                 { 
  105.                     foreach ($custom_data as $key => $val
  106.                     { 
  107.                         $session[$key] = $val
  108.                     } 
  109.                 } 
  110.             } 
  111.         } 
  112.  
  113.         // Session is valid! 
  114.         $this->userdata = $session
  115.         unset($session); 
  116.  
  117.         return TRUE; 
  118.     } 
  119.  

上传页面上传的session参数:

  1. {"PHPSESSID" : '<?php echo $this->input->cookie($this->session->sess_cookie_name); ?>'
上传程序处理部分的判断:
  1. $this->session->sess_match_useragent = false; 
  2. $this->session->sess_read($_POST["PHPSESSID"]); 
  3.  
  4. if (!$this->session->userdata['userid']) { 
  5.     header("HTTP/1.1 401 Unauthorized"); 
  6.     echo "Unauthorized"
  7.     exit(0); 
至此修改完成。
(责任编辑:wiwi) 转载请注明 来源于itRef.cn技术参考网站:
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容