[php5]classe de session

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 041 fois - Téléchargée 20 fois

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

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
vendredi 28 mai 2004
Statut
Membre
Dernière intervention
20 septembre 2012

Bonjour à vous,
juste pour information:
Applications web : sécuriser la session utilisateur =>
cyberzoide.developpez.com/securite/session ça date de 2006 mais c'est toujours bon à prendre.
Bonne journée à vous.
Messages postés
1
Date d'inscription
mardi 28 décembre 2010
Statut
Membre
Dernière intervention
12 janvier 2011

s 'il vous plait je veux une session qui permet de gérer une bande livraison ajouter une quantité et un cin et un on appuie sur une bouton puis on reçois un message de confirmation
Messages postés
37
Date d'inscription
mardi 1 novembre 2005
Statut
Membre
Dernière intervention
24 février 2008

J'utilise PHP 5.1.6, ma source actuellement est posté ici, pour pouvoir utiliser des tableaux à plusieurs dimensions, j'ai étendu ma classe par RecursiveArrayIterator, et me suis contenté de tester comme cela :
$session = new Session();
$session['test'] = array('un', 'deux', 'trois');
$session['test'][] = 'quatre';
print_r($session['test']);
Ce qui me provoque une erreure...
Il faut donc manipuler les classes et rajouter certaines méthodes, mais c'est plutôt flou tout ça :p
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
Il faudrait que je vois ton code et la manière dont tu l'as implémenté, dans ce cas, pour t'aider.
Messages postés
37
Date d'inscription
mardi 1 novembre 2005
Statut
Membre
Dernière intervention
24 février 2008

Oui, je suis d'accord mais comment faire le lien entre ça et ma source ?
Afficher les 27 commentaires

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.