Is it enough for PHP secure session class?
$begingroup$
I need you help with my php session class. I can not understand, the class implements adequate work with sessions. By adequate work, I understand the security and correctness of the methods.
<?php
namespace Core;
class Session
{
/**
* @var string Название сесии
*/
private $name;
/**
* @var array Cookie сессии
*/
private $cookie;
/**
* @var int Время жизни сессии
*/
private $timeToLive;
/**
* Session constructor
* @see http://php.net/manual/ru/session.configuration.php Настройка во время выполнения
* @see http://php.net/manual/ru/function.session-set-cookie-params.php PHP session_set_cookie_params
* @param int $time_to_live Время жизни сессии (в минутах)
* @param string $name
* @param array $cookie
*/
public function __construct($time_to_live = 30, $name = "application.session", $cookie = )
{
$this->timeToLive = $time_to_live;
// Изменяется имя сеанса (по умолчанию) на указанное (если есть) имя для конкретного приложения
$this->name = $name;
$this->cookie = $cookie;
// session.cookie_path определяет устанавливаемый путь в сессионной cookie
// session.cookie_domain определяет устанавливаемый домен в сессионной cookie
$this->cookie += [
'lifetime' => 0,
'path' => ini_get('session.cookie_path'),
'domain' => ini_get('session.cookie_domain'),
'secure' => isset($_SERVER['HTTPS']),
'httponly' => true
];
/*
* Указывается, что сеансы должны передаваться только с помощью файлов cookie,
* исключая возможность отправки идентификатора сеанса в качестве параметра «GET».
* Установка параметров cookie идентификатора сеанса. Эти параметры могут быть переопределены при инициализации
* обработчика сеанса, однако рекомендуется использовать значения по умолчанию, разрешающие отправку
* только по HTTPS (если имеется) и ограниченный доступ HTTP (без доступа к сценарию на стороне клиента).
*/
// Определяет, будет ли модуль использовать cookies для хранения идентификатора сессии на стороне клиента
ini_set('session.use_cookies', 1);
// Определяет, будет ли модуль использовать только cookies для хранения идентификатора сессии на стороне клиента
ini_set('session.use_only_cookies', 1);
session_set_cookie_params(
$this->cookie['lifetime'],
$this->cookie['path'],
$this->cookie['domain'],
$this->cookie['secure'],
$this->cookie['httponly']
);
}
public function __get($name)
{
switch ($name) {
case 'isActive':
return $this->getActive();
case 'id':
return $this->getId();
case 'name':
return isset($this->name) ? $this->name : $this->getName();
case 'isValid':
return $this->isValid();
}
}
public function __set($name, $value)
{
switch ($name) {
case 'id':
$this->setId($value);
break;
case 'name':
$this->setName($value);
break;
case 'timeToLive':
$this->timeToLive = $value * 60;
break;
}
}
/**
* Получение статуса активности сессии
* @see https://secure.php.net/manual/en/function.session-status.php PHP session_status
* @return bool Статус активности сессии
*/
private function getActive()
{
return session_status() === PHP_SESSION_ACTIVE;
}
/**
* Получение идентификатора текущей сессии.
* Метод является оберткой для реализации стандартного метода.
* @see https://secure.php.net/manual/ru/function.session-id.php PHP session_id
* @return string
*/
private function getId()
{
return session_id();
}
/**
* Получение имени сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-name.php PHP session_name
* @return string|null
*/
private function getName()
{
return $this->isActive ? session_name() : null;
}
private function isValid()
{
return !$this->isExpired() && $this->isFingerprint();
}
/**
* Проверка срока действия сессии
* @return bool
*/
private function isExpired()
{
$activity = isset($_SESSION['_last_activity']) ? $_SESSION['_last_activity'] : false;
if ($activity && ((time() - $activity) > $this->timeToLive)) {
return true;
}
$_SESSION['_last_activity'] = time();
return false;
}
/**
* Проверка клиента
* @return bool
*/
private function isFingerprint()
{
$hash = sha1($_SERVER['HTTP_USER_AGENT'] .
(ip2long($_SERVER['REMOTE_ADDR']) & ip2long('255.255.0.0')));
if (isset($_SESSION['_fingerprint'])) {
return $_SESSION['_fingerprint'] === $hash;
}
$_SESSION['_fingerprint'] = $hash;
return true;
}
/**
* Назначение идентификатора текущей сессии.
* Метод является оберткой для реализации стандартного метода.
* @see https://secure.php.net/manual/ru/function.session-id.php PHP session_id
* @param string $id Идентификатор сессии для текущей сессии
*/
private function setId($id)
{
session_id($id);
}
/**
* Установка имени сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-name.php PHP session_name
* @param $name
*/
public function setName($name)
{
if ($this->isActive) {
session_name($name);
}
}
/**
* Инициализация сессии
*/
public function open()
{
// Бездействие, если сессия была инициализирована ранее
if ($this->isActive) {
return;
}
session_start();
// Проверка на корректность инициализированнйо сессии
if (!$this->isActive) {
// TODO: Вывод исключения
}
}
/**
* Уничтожение сессии, включая все атрибуты. Метод имеет эффект только при наличии активной сессии.
* @see http://php.net/manual/ru/function.setcookie.php PHP setcookie
*/
public function destroy()
{
if ($this->isActive) {
$this->deleteAll();
setcookie(
$this->name,
time() - 42000,
$this->cookie['path'],
$this->cookie['domain'],
$this->cookie['secure'],
$this->cookie['httponly']
);
session_destroy();
}
}
/**
* Удаление всех значений сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-unset.php PHP session_unset
*/
public function deleteAll()
{
if ($this->isActive) {
session_unset();
}
}
/**
* Обновление текущего ID на новый. Метод имеет эффект только при наличии активной сессии.
* @see https://secure.php.net/session_regenerate_id PHP session_regenerate_id
* @param bool $delete_old_session
*/
public function refresh($delete_old_session = true)
{
if ($this->isActive) {
session_regenerate_id($delete_old_session);
}
}
/**
* Получение значение сессии по ключу.
* @param string $key Ключ, по которому необходимо получить значения
* @return null|mixed Значение сессии по ключу
*/
public function get($key)
{
if ($this->isActive) {
return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
}
return null;
}
/**
* Добавление или установка значений в сессию по ключу
* @param string $key Ключ, в который необходимо добавить значения
* @param string $value Значение добавления
*/
public function set($key, $value)
{
if ($this->isActive) {
$_SESSION[$key] = $value;
}
}
/**
* Удаление значения сессии по ключу
* @param string $key Ключ, по которому необходимо удалить значения
*/
public function delete($key)
{
if ($this->isActive && isset($_SESSION[$key])) {
unset($_SESSION[$key]);
}
}
/**
* Проверка наличия ключа у сессии
* @param string $key Ключ, в который необходимо найти
* @return bool
*/
public function hasKey($key)
{
return ($this->isActive && isset($_SESSION[$key]));
}
}
Usage
$session = new Session();
$session->open();
// If AFK more than access - logout
if (!$session->isValid) {
$session->destroy();
}
...
What are your thoughts and comments on this decision?
php security session
New contributor
$endgroup$
add a comment |
$begingroup$
I need you help with my php session class. I can not understand, the class implements adequate work with sessions. By adequate work, I understand the security and correctness of the methods.
<?php
namespace Core;
class Session
{
/**
* @var string Название сесии
*/
private $name;
/**
* @var array Cookie сессии
*/
private $cookie;
/**
* @var int Время жизни сессии
*/
private $timeToLive;
/**
* Session constructor
* @see http://php.net/manual/ru/session.configuration.php Настройка во время выполнения
* @see http://php.net/manual/ru/function.session-set-cookie-params.php PHP session_set_cookie_params
* @param int $time_to_live Время жизни сессии (в минутах)
* @param string $name
* @param array $cookie
*/
public function __construct($time_to_live = 30, $name = "application.session", $cookie = )
{
$this->timeToLive = $time_to_live;
// Изменяется имя сеанса (по умолчанию) на указанное (если есть) имя для конкретного приложения
$this->name = $name;
$this->cookie = $cookie;
// session.cookie_path определяет устанавливаемый путь в сессионной cookie
// session.cookie_domain определяет устанавливаемый домен в сессионной cookie
$this->cookie += [
'lifetime' => 0,
'path' => ini_get('session.cookie_path'),
'domain' => ini_get('session.cookie_domain'),
'secure' => isset($_SERVER['HTTPS']),
'httponly' => true
];
/*
* Указывается, что сеансы должны передаваться только с помощью файлов cookie,
* исключая возможность отправки идентификатора сеанса в качестве параметра «GET».
* Установка параметров cookie идентификатора сеанса. Эти параметры могут быть переопределены при инициализации
* обработчика сеанса, однако рекомендуется использовать значения по умолчанию, разрешающие отправку
* только по HTTPS (если имеется) и ограниченный доступ HTTP (без доступа к сценарию на стороне клиента).
*/
// Определяет, будет ли модуль использовать cookies для хранения идентификатора сессии на стороне клиента
ini_set('session.use_cookies', 1);
// Определяет, будет ли модуль использовать только cookies для хранения идентификатора сессии на стороне клиента
ini_set('session.use_only_cookies', 1);
session_set_cookie_params(
$this->cookie['lifetime'],
$this->cookie['path'],
$this->cookie['domain'],
$this->cookie['secure'],
$this->cookie['httponly']
);
}
public function __get($name)
{
switch ($name) {
case 'isActive':
return $this->getActive();
case 'id':
return $this->getId();
case 'name':
return isset($this->name) ? $this->name : $this->getName();
case 'isValid':
return $this->isValid();
}
}
public function __set($name, $value)
{
switch ($name) {
case 'id':
$this->setId($value);
break;
case 'name':
$this->setName($value);
break;
case 'timeToLive':
$this->timeToLive = $value * 60;
break;
}
}
/**
* Получение статуса активности сессии
* @see https://secure.php.net/manual/en/function.session-status.php PHP session_status
* @return bool Статус активности сессии
*/
private function getActive()
{
return session_status() === PHP_SESSION_ACTIVE;
}
/**
* Получение идентификатора текущей сессии.
* Метод является оберткой для реализации стандартного метода.
* @see https://secure.php.net/manual/ru/function.session-id.php PHP session_id
* @return string
*/
private function getId()
{
return session_id();
}
/**
* Получение имени сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-name.php PHP session_name
* @return string|null
*/
private function getName()
{
return $this->isActive ? session_name() : null;
}
private function isValid()
{
return !$this->isExpired() && $this->isFingerprint();
}
/**
* Проверка срока действия сессии
* @return bool
*/
private function isExpired()
{
$activity = isset($_SESSION['_last_activity']) ? $_SESSION['_last_activity'] : false;
if ($activity && ((time() - $activity) > $this->timeToLive)) {
return true;
}
$_SESSION['_last_activity'] = time();
return false;
}
/**
* Проверка клиента
* @return bool
*/
private function isFingerprint()
{
$hash = sha1($_SERVER['HTTP_USER_AGENT'] .
(ip2long($_SERVER['REMOTE_ADDR']) & ip2long('255.255.0.0')));
if (isset($_SESSION['_fingerprint'])) {
return $_SESSION['_fingerprint'] === $hash;
}
$_SESSION['_fingerprint'] = $hash;
return true;
}
/**
* Назначение идентификатора текущей сессии.
* Метод является оберткой для реализации стандартного метода.
* @see https://secure.php.net/manual/ru/function.session-id.php PHP session_id
* @param string $id Идентификатор сессии для текущей сессии
*/
private function setId($id)
{
session_id($id);
}
/**
* Установка имени сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-name.php PHP session_name
* @param $name
*/
public function setName($name)
{
if ($this->isActive) {
session_name($name);
}
}
/**
* Инициализация сессии
*/
public function open()
{
// Бездействие, если сессия была инициализирована ранее
if ($this->isActive) {
return;
}
session_start();
// Проверка на корректность инициализированнйо сессии
if (!$this->isActive) {
// TODO: Вывод исключения
}
}
/**
* Уничтожение сессии, включая все атрибуты. Метод имеет эффект только при наличии активной сессии.
* @see http://php.net/manual/ru/function.setcookie.php PHP setcookie
*/
public function destroy()
{
if ($this->isActive) {
$this->deleteAll();
setcookie(
$this->name,
time() - 42000,
$this->cookie['path'],
$this->cookie['domain'],
$this->cookie['secure'],
$this->cookie['httponly']
);
session_destroy();
}
}
/**
* Удаление всех значений сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-unset.php PHP session_unset
*/
public function deleteAll()
{
if ($this->isActive) {
session_unset();
}
}
/**
* Обновление текущего ID на новый. Метод имеет эффект только при наличии активной сессии.
* @see https://secure.php.net/session_regenerate_id PHP session_regenerate_id
* @param bool $delete_old_session
*/
public function refresh($delete_old_session = true)
{
if ($this->isActive) {
session_regenerate_id($delete_old_session);
}
}
/**
* Получение значение сессии по ключу.
* @param string $key Ключ, по которому необходимо получить значения
* @return null|mixed Значение сессии по ключу
*/
public function get($key)
{
if ($this->isActive) {
return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
}
return null;
}
/**
* Добавление или установка значений в сессию по ключу
* @param string $key Ключ, в который необходимо добавить значения
* @param string $value Значение добавления
*/
public function set($key, $value)
{
if ($this->isActive) {
$_SESSION[$key] = $value;
}
}
/**
* Удаление значения сессии по ключу
* @param string $key Ключ, по которому необходимо удалить значения
*/
public function delete($key)
{
if ($this->isActive && isset($_SESSION[$key])) {
unset($_SESSION[$key]);
}
}
/**
* Проверка наличия ключа у сессии
* @param string $key Ключ, в который необходимо найти
* @return bool
*/
public function hasKey($key)
{
return ($this->isActive && isset($_SESSION[$key]));
}
}
Usage
$session = new Session();
$session->open();
// If AFK more than access - logout
if (!$session->isValid) {
$session->destroy();
}
...
What are your thoughts and comments on this decision?
php security session
New contributor
$endgroup$
$begingroup$
Welcome to Code Review! The (doc) comments would be of little value for me but for web translators.
$endgroup$
– greybeard
10 hours ago
$begingroup$
@greybeard ok, I will translate it
$endgroup$
– mepihindeveloper
9 hours ago
add a comment |
$begingroup$
I need you help with my php session class. I can not understand, the class implements adequate work with sessions. By adequate work, I understand the security and correctness of the methods.
<?php
namespace Core;
class Session
{
/**
* @var string Название сесии
*/
private $name;
/**
* @var array Cookie сессии
*/
private $cookie;
/**
* @var int Время жизни сессии
*/
private $timeToLive;
/**
* Session constructor
* @see http://php.net/manual/ru/session.configuration.php Настройка во время выполнения
* @see http://php.net/manual/ru/function.session-set-cookie-params.php PHP session_set_cookie_params
* @param int $time_to_live Время жизни сессии (в минутах)
* @param string $name
* @param array $cookie
*/
public function __construct($time_to_live = 30, $name = "application.session", $cookie = )
{
$this->timeToLive = $time_to_live;
// Изменяется имя сеанса (по умолчанию) на указанное (если есть) имя для конкретного приложения
$this->name = $name;
$this->cookie = $cookie;
// session.cookie_path определяет устанавливаемый путь в сессионной cookie
// session.cookie_domain определяет устанавливаемый домен в сессионной cookie
$this->cookie += [
'lifetime' => 0,
'path' => ini_get('session.cookie_path'),
'domain' => ini_get('session.cookie_domain'),
'secure' => isset($_SERVER['HTTPS']),
'httponly' => true
];
/*
* Указывается, что сеансы должны передаваться только с помощью файлов cookie,
* исключая возможность отправки идентификатора сеанса в качестве параметра «GET».
* Установка параметров cookie идентификатора сеанса. Эти параметры могут быть переопределены при инициализации
* обработчика сеанса, однако рекомендуется использовать значения по умолчанию, разрешающие отправку
* только по HTTPS (если имеется) и ограниченный доступ HTTP (без доступа к сценарию на стороне клиента).
*/
// Определяет, будет ли модуль использовать cookies для хранения идентификатора сессии на стороне клиента
ini_set('session.use_cookies', 1);
// Определяет, будет ли модуль использовать только cookies для хранения идентификатора сессии на стороне клиента
ini_set('session.use_only_cookies', 1);
session_set_cookie_params(
$this->cookie['lifetime'],
$this->cookie['path'],
$this->cookie['domain'],
$this->cookie['secure'],
$this->cookie['httponly']
);
}
public function __get($name)
{
switch ($name) {
case 'isActive':
return $this->getActive();
case 'id':
return $this->getId();
case 'name':
return isset($this->name) ? $this->name : $this->getName();
case 'isValid':
return $this->isValid();
}
}
public function __set($name, $value)
{
switch ($name) {
case 'id':
$this->setId($value);
break;
case 'name':
$this->setName($value);
break;
case 'timeToLive':
$this->timeToLive = $value * 60;
break;
}
}
/**
* Получение статуса активности сессии
* @see https://secure.php.net/manual/en/function.session-status.php PHP session_status
* @return bool Статус активности сессии
*/
private function getActive()
{
return session_status() === PHP_SESSION_ACTIVE;
}
/**
* Получение идентификатора текущей сессии.
* Метод является оберткой для реализации стандартного метода.
* @see https://secure.php.net/manual/ru/function.session-id.php PHP session_id
* @return string
*/
private function getId()
{
return session_id();
}
/**
* Получение имени сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-name.php PHP session_name
* @return string|null
*/
private function getName()
{
return $this->isActive ? session_name() : null;
}
private function isValid()
{
return !$this->isExpired() && $this->isFingerprint();
}
/**
* Проверка срока действия сессии
* @return bool
*/
private function isExpired()
{
$activity = isset($_SESSION['_last_activity']) ? $_SESSION['_last_activity'] : false;
if ($activity && ((time() - $activity) > $this->timeToLive)) {
return true;
}
$_SESSION['_last_activity'] = time();
return false;
}
/**
* Проверка клиента
* @return bool
*/
private function isFingerprint()
{
$hash = sha1($_SERVER['HTTP_USER_AGENT'] .
(ip2long($_SERVER['REMOTE_ADDR']) & ip2long('255.255.0.0')));
if (isset($_SESSION['_fingerprint'])) {
return $_SESSION['_fingerprint'] === $hash;
}
$_SESSION['_fingerprint'] = $hash;
return true;
}
/**
* Назначение идентификатора текущей сессии.
* Метод является оберткой для реализации стандартного метода.
* @see https://secure.php.net/manual/ru/function.session-id.php PHP session_id
* @param string $id Идентификатор сессии для текущей сессии
*/
private function setId($id)
{
session_id($id);
}
/**
* Установка имени сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-name.php PHP session_name
* @param $name
*/
public function setName($name)
{
if ($this->isActive) {
session_name($name);
}
}
/**
* Инициализация сессии
*/
public function open()
{
// Бездействие, если сессия была инициализирована ранее
if ($this->isActive) {
return;
}
session_start();
// Проверка на корректность инициализированнйо сессии
if (!$this->isActive) {
// TODO: Вывод исключения
}
}
/**
* Уничтожение сессии, включая все атрибуты. Метод имеет эффект только при наличии активной сессии.
* @see http://php.net/manual/ru/function.setcookie.php PHP setcookie
*/
public function destroy()
{
if ($this->isActive) {
$this->deleteAll();
setcookie(
$this->name,
time() - 42000,
$this->cookie['path'],
$this->cookie['domain'],
$this->cookie['secure'],
$this->cookie['httponly']
);
session_destroy();
}
}
/**
* Удаление всех значений сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-unset.php PHP session_unset
*/
public function deleteAll()
{
if ($this->isActive) {
session_unset();
}
}
/**
* Обновление текущего ID на новый. Метод имеет эффект только при наличии активной сессии.
* @see https://secure.php.net/session_regenerate_id PHP session_regenerate_id
* @param bool $delete_old_session
*/
public function refresh($delete_old_session = true)
{
if ($this->isActive) {
session_regenerate_id($delete_old_session);
}
}
/**
* Получение значение сессии по ключу.
* @param string $key Ключ, по которому необходимо получить значения
* @return null|mixed Значение сессии по ключу
*/
public function get($key)
{
if ($this->isActive) {
return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
}
return null;
}
/**
* Добавление или установка значений в сессию по ключу
* @param string $key Ключ, в который необходимо добавить значения
* @param string $value Значение добавления
*/
public function set($key, $value)
{
if ($this->isActive) {
$_SESSION[$key] = $value;
}
}
/**
* Удаление значения сессии по ключу
* @param string $key Ключ, по которому необходимо удалить значения
*/
public function delete($key)
{
if ($this->isActive && isset($_SESSION[$key])) {
unset($_SESSION[$key]);
}
}
/**
* Проверка наличия ключа у сессии
* @param string $key Ключ, в который необходимо найти
* @return bool
*/
public function hasKey($key)
{
return ($this->isActive && isset($_SESSION[$key]));
}
}
Usage
$session = new Session();
$session->open();
// If AFK more than access - logout
if (!$session->isValid) {
$session->destroy();
}
...
What are your thoughts and comments on this decision?
php security session
New contributor
$endgroup$
I need you help with my php session class. I can not understand, the class implements adequate work with sessions. By adequate work, I understand the security and correctness of the methods.
<?php
namespace Core;
class Session
{
/**
* @var string Название сесии
*/
private $name;
/**
* @var array Cookie сессии
*/
private $cookie;
/**
* @var int Время жизни сессии
*/
private $timeToLive;
/**
* Session constructor
* @see http://php.net/manual/ru/session.configuration.php Настройка во время выполнения
* @see http://php.net/manual/ru/function.session-set-cookie-params.php PHP session_set_cookie_params
* @param int $time_to_live Время жизни сессии (в минутах)
* @param string $name
* @param array $cookie
*/
public function __construct($time_to_live = 30, $name = "application.session", $cookie = )
{
$this->timeToLive = $time_to_live;
// Изменяется имя сеанса (по умолчанию) на указанное (если есть) имя для конкретного приложения
$this->name = $name;
$this->cookie = $cookie;
// session.cookie_path определяет устанавливаемый путь в сессионной cookie
// session.cookie_domain определяет устанавливаемый домен в сессионной cookie
$this->cookie += [
'lifetime' => 0,
'path' => ini_get('session.cookie_path'),
'domain' => ini_get('session.cookie_domain'),
'secure' => isset($_SERVER['HTTPS']),
'httponly' => true
];
/*
* Указывается, что сеансы должны передаваться только с помощью файлов cookie,
* исключая возможность отправки идентификатора сеанса в качестве параметра «GET».
* Установка параметров cookie идентификатора сеанса. Эти параметры могут быть переопределены при инициализации
* обработчика сеанса, однако рекомендуется использовать значения по умолчанию, разрешающие отправку
* только по HTTPS (если имеется) и ограниченный доступ HTTP (без доступа к сценарию на стороне клиента).
*/
// Определяет, будет ли модуль использовать cookies для хранения идентификатора сессии на стороне клиента
ini_set('session.use_cookies', 1);
// Определяет, будет ли модуль использовать только cookies для хранения идентификатора сессии на стороне клиента
ini_set('session.use_only_cookies', 1);
session_set_cookie_params(
$this->cookie['lifetime'],
$this->cookie['path'],
$this->cookie['domain'],
$this->cookie['secure'],
$this->cookie['httponly']
);
}
public function __get($name)
{
switch ($name) {
case 'isActive':
return $this->getActive();
case 'id':
return $this->getId();
case 'name':
return isset($this->name) ? $this->name : $this->getName();
case 'isValid':
return $this->isValid();
}
}
public function __set($name, $value)
{
switch ($name) {
case 'id':
$this->setId($value);
break;
case 'name':
$this->setName($value);
break;
case 'timeToLive':
$this->timeToLive = $value * 60;
break;
}
}
/**
* Получение статуса активности сессии
* @see https://secure.php.net/manual/en/function.session-status.php PHP session_status
* @return bool Статус активности сессии
*/
private function getActive()
{
return session_status() === PHP_SESSION_ACTIVE;
}
/**
* Получение идентификатора текущей сессии.
* Метод является оберткой для реализации стандартного метода.
* @see https://secure.php.net/manual/ru/function.session-id.php PHP session_id
* @return string
*/
private function getId()
{
return session_id();
}
/**
* Получение имени сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-name.php PHP session_name
* @return string|null
*/
private function getName()
{
return $this->isActive ? session_name() : null;
}
private function isValid()
{
return !$this->isExpired() && $this->isFingerprint();
}
/**
* Проверка срока действия сессии
* @return bool
*/
private function isExpired()
{
$activity = isset($_SESSION['_last_activity']) ? $_SESSION['_last_activity'] : false;
if ($activity && ((time() - $activity) > $this->timeToLive)) {
return true;
}
$_SESSION['_last_activity'] = time();
return false;
}
/**
* Проверка клиента
* @return bool
*/
private function isFingerprint()
{
$hash = sha1($_SERVER['HTTP_USER_AGENT'] .
(ip2long($_SERVER['REMOTE_ADDR']) & ip2long('255.255.0.0')));
if (isset($_SESSION['_fingerprint'])) {
return $_SESSION['_fingerprint'] === $hash;
}
$_SESSION['_fingerprint'] = $hash;
return true;
}
/**
* Назначение идентификатора текущей сессии.
* Метод является оберткой для реализации стандартного метода.
* @see https://secure.php.net/manual/ru/function.session-id.php PHP session_id
* @param string $id Идентификатор сессии для текущей сессии
*/
private function setId($id)
{
session_id($id);
}
/**
* Установка имени сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-name.php PHP session_name
* @param $name
*/
public function setName($name)
{
if ($this->isActive) {
session_name($name);
}
}
/**
* Инициализация сессии
*/
public function open()
{
// Бездействие, если сессия была инициализирована ранее
if ($this->isActive) {
return;
}
session_start();
// Проверка на корректность инициализированнйо сессии
if (!$this->isActive) {
// TODO: Вывод исключения
}
}
/**
* Уничтожение сессии, включая все атрибуты. Метод имеет эффект только при наличии активной сессии.
* @see http://php.net/manual/ru/function.setcookie.php PHP setcookie
*/
public function destroy()
{
if ($this->isActive) {
$this->deleteAll();
setcookie(
$this->name,
time() - 42000,
$this->cookie['path'],
$this->cookie['domain'],
$this->cookie['secure'],
$this->cookie['httponly']
);
session_destroy();
}
}
/**
* Удаление всех значений сессии
* Метод является оберткой для реализации стандартного метода
* @see http://php.net/manual/ru/function.session-unset.php PHP session_unset
*/
public function deleteAll()
{
if ($this->isActive) {
session_unset();
}
}
/**
* Обновление текущего ID на новый. Метод имеет эффект только при наличии активной сессии.
* @see https://secure.php.net/session_regenerate_id PHP session_regenerate_id
* @param bool $delete_old_session
*/
public function refresh($delete_old_session = true)
{
if ($this->isActive) {
session_regenerate_id($delete_old_session);
}
}
/**
* Получение значение сессии по ключу.
* @param string $key Ключ, по которому необходимо получить значения
* @return null|mixed Значение сессии по ключу
*/
public function get($key)
{
if ($this->isActive) {
return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
}
return null;
}
/**
* Добавление или установка значений в сессию по ключу
* @param string $key Ключ, в который необходимо добавить значения
* @param string $value Значение добавления
*/
public function set($key, $value)
{
if ($this->isActive) {
$_SESSION[$key] = $value;
}
}
/**
* Удаление значения сессии по ключу
* @param string $key Ключ, по которому необходимо удалить значения
*/
public function delete($key)
{
if ($this->isActive && isset($_SESSION[$key])) {
unset($_SESSION[$key]);
}
}
/**
* Проверка наличия ключа у сессии
* @param string $key Ключ, в который необходимо найти
* @return bool
*/
public function hasKey($key)
{
return ($this->isActive && isset($_SESSION[$key]));
}
}
Usage
$session = new Session();
$session->open();
// If AFK more than access - logout
if (!$session->isValid) {
$session->destroy();
}
...
What are your thoughts and comments on this decision?
php security session
php security session
New contributor
New contributor
New contributor
asked 12 hours ago
mepihindevelopermepihindeveloper
1062
1062
New contributor
New contributor
$begingroup$
Welcome to Code Review! The (doc) comments would be of little value for me but for web translators.
$endgroup$
– greybeard
10 hours ago
$begingroup$
@greybeard ok, I will translate it
$endgroup$
– mepihindeveloper
9 hours ago
add a comment |
$begingroup$
Welcome to Code Review! The (doc) comments would be of little value for me but for web translators.
$endgroup$
– greybeard
10 hours ago
$begingroup$
@greybeard ok, I will translate it
$endgroup$
– mepihindeveloper
9 hours ago
$begingroup$
Welcome to Code Review! The (doc) comments would be of little value for me but for web translators.
$endgroup$
– greybeard
10 hours ago
$begingroup$
Welcome to Code Review! The (doc) comments would be of little value for me but for web translators.
$endgroup$
– greybeard
10 hours ago
$begingroup$
@greybeard ok, I will translate it
$endgroup$
– mepihindeveloper
9 hours ago
$begingroup$
@greybeard ok, I will translate it
$endgroup$
– mepihindeveloper
9 hours ago
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
mepihindeveloper is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215931%2fis-it-enough-for-php-secure-session-class%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
mepihindeveloper is a new contributor. Be nice, and check out our Code of Conduct.
mepihindeveloper is a new contributor. Be nice, and check out our Code of Conduct.
mepihindeveloper is a new contributor. Be nice, and check out our Code of Conduct.
mepihindeveloper is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215931%2fis-it-enough-for-php-secure-session-class%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
Welcome to Code Review! The (doc) comments would be of little value for me but for web translators.
$endgroup$
– greybeard
10 hours ago
$begingroup$
@greybeard ok, I will translate it
$endgroup$
– mepihindeveloper
9 hours ago