[php5]classe de session

Contenu du snippet

Bonjour,
voici une classe qui permet de manipuler les sessions afin de ne pas ré ecrire tous le code si un jour, vous voulez les utiliser différement.
De plus cette classe sécurise en enregistrant dans une variable une marque d'empreinte qu'elle compare à chaque instance et regénère l'id.

Je pense qu'elle n'est pas tout à fait optimiser et j'attends de vous des critiques constructives afin de l'ameliorer...

Source / Exemple :


<?php

class Session implements ArrayAccess
{
	const SALT_LENGTH = 9;
	
	private static
		$initiated   = false,
		$fingerprint = null;
		
	public function __construct()
	{
		session_start();
		$this->check();
	}
	
	private function check()
	{
		// prevent session fixation
		if (self::$initiated == false)
		{
			session_regenerate_id();
			self::$initiated = true;
		}

		// prevent session hijacking
		if (!is_null(self::$fingerprint))
		{
			if (self::$fingerprint !== $this->generateHash($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR'], self::$fingerprint))
			{
				throw new Exception('Votre session est invalide');
			}
		}
		else
		{
			self::$fingerprint = $this->generateHash($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']);
		}
	}
	
	private function generateHash($plain_text, $salt = null)
	{
		if (is_null($salt) == true)
		{
			$salt = substr(md5(uniqid(mt_rand(), true)), 0, self::SALT_LENGTH);
		}
		else
		{
			$salt = substr($salt, 0, self::SALT_LENGTH);
		}
		
		return $salt . sha1(strrev($salt) . $plain_text);
	}

	public function offsetExists($offset)
	{
		return isset($_SESSION[$offset]);    
	}
	
	public function offsetSet($offset, $value)
	{
		$_SESSION[$offset] = $value;
	}
	
	public function offsetUnset($offset)
	{
		if (isset($_SESSION[$offset]))
		{
			unset($_SESSION[$offset]);
		}
	}
	
	public function offsetGet($offset)
	{
		if (isset($_SESSION[$offset]))
		{
			return $_SESSION[$offset];
		}
		
		return null;
	}

	public function __destruct()
	{
		session_write_close();
	}
}

?>

Conclusion :


J'utilise une classe 'Registry' me permettant de n'avoir une seule intance de l'objet. Peut être faudrait-il rajouter une méthode singleton pour l'utiliser...

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.