Улучшение работы кук

pull/299/head
andreymal 2022-05-25 15:03:06 +03:00
parent 87a7b4cf6b
commit 4965d9ddf6
Signed by: andreymal
GPG Key ID: CB605DA977D27A93
3 changed files with 67 additions and 14 deletions

View File

@ -592,23 +592,52 @@ class ModuleUser extends Module
* Ставим куку
*/
if ($bRemember) {
setcookie('key', $sKey, time()+Config::Get('sys.cookie.time'), Config::Get('sys.cookie.path'), Config::Get('sys.cookie.host'), false, true);
$this->SetUserKeyCookie($sKey);
}
return true;
}
/**
* Установка куки с ключом аутентификации
*
* @param string $sKey Ключ аутентификации
* @param int|null $iExpires Время жизни куки
*/
protected function SetUserKeyCookie($sKey, $iExpires=null) {
if (is_null($iExpires)) {
$iExpires = time() + Config::Get('sys.cookie.time');
}
setcookie(
'key',
$sKey,
[
'expires' => $iExpires,
'path' => Config::Get('sys.cookie.path'),
'domain' => Config::Get('sys.cookie.host'),
'secure' => Config::Get('sys.cookie.secure'),
'httponly' => true,
'samesite' => Config::Get('sys.cookie.samesite'),
]
);
/**
* Чтобы сохранять сессию живой, кука периодически ставится заново;
* здесь хранится время последней установки
*/
$this->Session_Set('last_cookie_ping', time());
}
/**
* Залогинивание по ключу аутентификации
*
*/
protected function AutoLogin()
{
$sKeyFromCookies = getRequestStr('key', null, 'cookie');
/**
* Если есть живая php-сессия - информация из неё более приоритетна.
* Если нет - попробуем залогиниться по ключу аутентификации из кук
*/
$sKey = $this->Session_Get('key');
if (empty($sKey)) {
$sKey = getRequestStr('key', null, 'cookie');
$sKey = $sKeyFromCookies;
}
if (empty($sKey)) {
return;
@ -621,6 +650,18 @@ class ModuleUser extends Module
if ($this->oUserCurrent) {
if (!$this->ValidateUserKey($this->oUserCurrent, $sKey)) {
$this->Logout();
return;
}
/**
* Если есть кука - периодически ставим её заново, чтобы сессия
* не слетала при активном посещении сайта
*/
$iPingInterval = Config::Get('sys.cookie.ping_interval');
if ($iPingInterval > 0 && !empty($sKeyFromCookies)) {
$iLastPing = $this->Session_Get('last_cookie_ping');
if (!$iLastPing || time() - $iLastPing >= $iPingInterval) {
$this->SetUserKeyCookie($sKeyFromCookies);
}
}
return;
}
@ -664,15 +705,16 @@ class ModuleUser extends Module
{
$this->oUserCurrent=null;
$this->oSession=null;
/**
* Дропаем куку
*/
$this->SetUserKeyCookie('', 1);
/**
* Дропаем из сессии
*/
$this->Session_Drop('user_id');
$this->Session_Drop('key');
/**
* Дропаем куку
*/
setcookie('key', '', 1, Config::Get('sys.cookie.path'), Config::Get('sys.cookie.host'));
$this->Session_Drop('last_cookie_ping');
}
/**
* Обновление данных сессии

View File

@ -54,11 +54,13 @@ class ModuleSession extends Module
protected function Start()
{
session_name(Config::Get('sys.session.name'));
session_set_cookie_params(
Config::Get('sys.session.timeout'),
Config::Get('sys.session.path'),
Config::Get('sys.session.host')
);
session_set_cookie_params([
'lifetime' => Config::Get('sys.session.timeout'),
'path' => Config::Get('sys.session.path'),
'domain' => Config::Get('sys.session.host'),
'secure' => Config::Get('sys.session.secure'),
'samesite' => Config::Get('sys.session.samesite'),
]);
if (!session_id()) {
/**
* Попытка подменить идентификатор имени сессии через куку
@ -98,9 +100,13 @@ class ModuleSession extends Module
setcookie(
Config::Get('sys.session.name'),
$this->sId,
time()+Config::Get('sys.session.timeout'),
Config::Get('sys.session.path'),
Config::Get('sys.session.host')
[
'expires' => time() + Config::Get('sys.session.timeout'),
'path' => Config::Get('sys.session.path'),
'domain' => Config::Get('sys.session.host'),
'secure' => Config::Get('sys.session.secure'),
'samesite' => Config::Get('sys.session.samesite'),
]
);
}
}

View File

@ -70,6 +70,9 @@ $config['smarty']['compile_check'] = true; // Проверять или нет
$config['sys']['cookie']['host'] = null; // хост для установки куков
$config['sys']['cookie']['path'] = '/'; // путь для установки куков
$config['sys']['cookie']['time'] = 60 * 60 * 24 * 7; // время жизни куки когда пользователь остается залогиненым на сайте
$config['sys']['cookie']['secure'] = false; // добавление атрибута Secure
$config['sys']['cookie']['samesite'] = 'Lax'; // значение атрибута SameSite
$config['sys']['cookie']['ping_interval'] = 60 * 60; // интервал периодического обновления куки аутентификации, чтобы она не слетала
/**
* Настройки сессий
*/
@ -77,6 +80,8 @@ $config['sys']['session']['name'] = 'TABUNSESSIONID'; // назван
$config['sys']['session']['timeout'] = '___sys.cookie.time___'; // Тайм-аут сессии в секундах (тот же, что и в cookies)
$config['sys']['session']['host'] = '___sys.cookie.host___'; // хост сессии в куках
$config['sys']['session']['path'] = '___sys.cookie.path___'; // путь сессии в куках
$config['sys']['session']['secure'] = '___sys.cookie.secure___';
$config['sys']['session']['samesite'] = '___sys.cookie.samesite___';
/**
* Настройки почтовых уведомлений
*/