CodeIgniter + Uploadify + Session

Straipsnis skirtas tiems kas naudoja CodeIgniter karkasą ir Uploadify failų įkėlimo programėlę. Kaip žinia Uploadify naudoja Flash, o Flash neperduoda cookies (sausainių) į serverį, jį naujai sukuria pats Flash. Taigi jūs negalite naudoti duomenų jau su esama sesija failų įkėlimo scripte.

Straipsnis nebus aprašytas kaip viskas veikia, kodėl Flash neperduoda esamos sesijos o susikuria savo sesiją, ar, kodėl naudojamas būtent Flash norint įkelti daug failų vienu metu. Straipsnis skirtas paprastai ir aiškiai paaiškinti su pavyzdžiai kaip įkelti failus ir kaip padaryti kad būtų naudojama ta pati sesija kurią jau sukūrė CodeIgniter.

1. Praplėčiame CI_Session klasę

  • Susikurkite naują failą MY_Session.php direktorijoje /application/libraries.
  • Nusikopijuokite visą sess_read() funkciją iš failo /system/libraries/Session.php į savo naujai sukurtą failą MY_Session.php

Susiraskite kode eilutę: 
 

$session = $this->CI->input->cookie($this->sess_cookie_name);

ir pakeiskite šią eilutę į:

  if (isset($_POST['browser_cookie'])) {
      $_cookie = $this->CI->input->post('browser_cookie');
      $enc_key = $this->CI->config->item('encryption_key');
      $session = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $enc_key, base64_decode($_cookie), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
  } 
  else {
      $session = $this->CI->input->cookie($this->sess_cookie_name);
  }

Visas My_Session.php failo turinys:

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class MY_Session extends CI_Session {
    // --------------------------------------------------------------------
 
	/**
	 * Fetch the current session data if it exists
	 *
	 * @return	bool
	 */
	public function sess_read()
	{
		// Fetch the cookie
		if (isset($_POST['browser_cookie'])) {
            $_cookie = $this->CI->input->post('browser_cookie');
            $enc_key = $this->CI->config->item('encryption_key');
            $session = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $enc_key, base64_decode($_cookie), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
        } 
        else {
            $session = $this->CI->input->cookie($this->sess_cookie_name);
        } 
 
		// 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
		{
			// encryption was not used, so we need to check the md5 hash
			$hash	 = substr($session, strlen($session)-32); // get last 32 chars
			$session = substr($session, 0, strlen($session)-32);
 
			// Does the md5 hash match? This is to prevent manipulation of session data in userspace
			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'], $session['ip_address'], $session['user_agent'], $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?
		if ($this->sess_match_ip == TRUE && $session['ip_address'] !== $this->CI->input->ip_address())
		{
			$this->sess_destroy();
			return FALSE;
		}
 
		// Does the User Agent Match?
		if ($this->sess_match_useragent == TRUE && 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?
		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->limit(1)->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) && $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;
	}
}
?>

2. Pakeičiame config.php failą

Tai yra svarbus dalykas, tad įsitikinkite kad tai tikrai atlikote.

  • Nustatykite savo sesijos kriptavimo raktą (encryption_key)
  • Nustatykite kad sesijos bus laikomis duomenų bazėje.(sess_use_database)
  • Nustatykite kad COdeIgniter netikrintų naršyklės User-Agent (sess_match_useragent)

3. Pavyzdys

Toliau teliko pasirašyti Uploadify scriptą kuris siųstų duomenis į serverį.

$('#do_upload').uploadify({
   swf: '/js/uploadify/uploadify.swf',
   uploader: '/objects/upload_images/' + object_id,
   post_params: {"browser_cookie": "<?php echo trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->config->item('encryption_key'), $_COOKIE[$this->config->item('sess_cookie_name')], MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); ?>"},
   cancelImage: '/js/uploadify/uploadify-cancel.png',
   checkExisting: false,
   multi: true,
   auto: true,
   onUploadSuccess: function(file, data, result){
       // Failas įkeltas
   }
});

4. Pabaiga

Tai tiek su failų įkėlimu su Uploadify, karkasu Codeigniter + Session klase.

Kas būtent buv pakeista ir kaip viskas vykdoma?

Iš esmės scriptas sukuria šifruotą sausainio versiją ir nusiunčia į jūsų serverį. Kai jūs praplėtėte CodeIginiter Session klasę kurioje nurodėte jog $_POST metodu bus gautas šifruotas sausainis (cookie). Tai atliekama tam, kad pats Flash to nesugeba padaryti.

Mindaugas

IT specialistas, PHP programuotojas. Sritys: PHP, MySQL, JavaScript, Ajax, jQuery, Arduino, (x)HTML, CSS, XML

More Posts - Website

Žymos: , ,

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *

Galite naudoti šias HTML žymas ir atributus: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>