ps2007
Новичок
Оценте/поругайте класс для работы с сессией
Собственно говоря, у меня нет вопроса, просто хочу поделиться своей работой и заодно услышать критику.
Написал для себя класс для работы с сессиями. Решает следующие проблемы безопасности: угон сессии, фиксация сессии, есть возможность автоматически регенерировать идентификатор сессии. Дополнительные фичи: "привязка" сессии к браузеру и IP адресу пользователя, lazy evaluation.
Методы:
function getVal($key) - получить значение элемента $key
function setVal($key, $value) - присвоить элементу $key значение $value
function unsetVal($key) - уничтожить элемент $key
function cutVal($key) - получить значение элемента $key и удалить его из сессии
function clear() - удалить все элементы, которые хранятся в сессии
function regenerateID() - сгенерировать новый идентификатор сессии (этот метод понадобится, если отключена автоматическая регенерация идентификатора сессии)
Вот простой пример использования:
Ну и сам код вышеописанного класса:
Если есть вопросы - задавайте.
Собственно говоря, у меня нет вопроса, просто хочу поделиться своей работой и заодно услышать критику.
Написал для себя класс для работы с сессиями. Решает следующие проблемы безопасности: угон сессии, фиксация сессии, есть возможность автоматически регенерировать идентификатор сессии. Дополнительные фичи: "привязка" сессии к браузеру и IP адресу пользователя, lazy evaluation.
Методы:
function getVal($key) - получить значение элемента $key
function setVal($key, $value) - присвоить элементу $key значение $value
function unsetVal($key) - уничтожить элемент $key
function cutVal($key) - получить значение элемента $key и удалить его из сессии
function clear() - удалить все элементы, которые хранятся в сессии
function regenerateID() - сгенерировать новый идентификатор сессии (этот метод понадобится, если отключена автоматическая регенерация идентификатора сессии)
Вот простой пример использования:
PHP:
require_once('class.CNativeSession.php');
$sess = new CNativeSession();
$now = $sess->getVal('now');
$count = $sess->getVal('count');
echo "now=$now, count=$count<br>\n";
$sess->setVal('now', time());
$sess->setVal('count', (int)$count+1);
Ну и сам код вышеописанного класса:
PHP:
<?
// todo: сделать конфигурирование
class CNativeSession
{
protected $sessionName = '_encrypted';
protected $lifetime = 3600;
protected $checkIP = TRUE;
protected $autoRegenerateID = TRUE;
protected $running = FALSE;
public function __construct()
{
ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.gc_maxlifetime', $this->lifetime);
}
public function getVal($key)
{
if (!$this->running) $this->start();
if (isset($_SESSION[$key])) {
return $_SESSION[$key];
}else{
return NULL;
}
}
public function setVal($key, $value)
{
if (!$this->running) $this->start();
$_SESSION[$key] = $value;
}
public function unsetVal($key)
{
if (!$this->running) $this->start();
unset($_SESSION[$key]);
}
public function cutVal($key)
{
$val = $this->getVal($key);
$this->unsetVal($key);
return $val;
}
public function clear()
{
if (!$this->running) $this->start();
$_SESSION = array();
}
// Метод стартует сессию, проверяет время жизни сессии и идентификатор клиента
protected function start()
{
$this->phpSessionInit();
if ($this->autoRegenerateID) $this->regenerateID();
if ($this->isExpired() || $this->isWrongFingerprint())
{
if (!$this->autoRegenerateID) $this->regenerateID();
$_SESSION = array();
}
$this->running = TRUE;
}
// Метод инициализирует механизм сессий PHP
protected function phpSessionInit()
{
if (!isset($_SESSION)) {
session_name($this->sessionName);
session_start();
}else{
$sn = session_name();
// ????? сделать обработку ошибок
if ($sn != $this->sessionName) die('Error: hostile session "'.$sn.'" already started.');
}
}
public function regenerateID()
{
session_regenerate_id(TRUE);
}
protected function isExpired()
{
$la = '__lastActivity';
$now = time();
$limit = $now - $this->lifetime;
if (isset($_SESSION[$la]) && $_SESSION[$la] < $limit)
{
return TRUE;
}
$_SESSION[$la] = $now;
return FALSE;
}
protected function isWrongFingerprint()
{
$cf = '__clientFingerprint';
$fingerprint = $_SERVER['HTTP_USER_AGENT'].
$_SERVER['HTTP_ACCEPT_LANGUAGE'].
$_SERVER['HTTP_ACCEPT_CHARSET'].
$_SERVER['HTTP_ACCEPT_ENCODING'].
$_SERVER['HTTP_CONNECTION'];
if ($this->checkIP) $fingerprint .= $_SERVER['REMOTE_ADDR'];
if (!isset($_SESSION[$cf]))
{
$_SESSION[$cf] = md5($fingerprint);
return FALSE;
}
if ($_SESSION[$cf] != md5($fingerprint)) return TRUE;
return FALSE;
}
}
?>
