- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/security/authentication.php
- Класс: BitrixMainSecurityAuthentication
- Вызов: Authentication::checkSessionSecurity
static function checkSessionSecurity(CurrentUser $user)
{
$context = BitrixMainApplication::getInstance()->getContext();
if (!($context instanceof BitrixMainHttpContext))
throw new BitrixMainNotSupportedException();
$policy = $user->getPolicy();
$currentTime = time();
/** @var $request BitrixMainHttpRequest */
$request = $context->getRequest();
$remoteAddress = $request->getRemoteAddress();
// IP address changed
$destroySession = $_SESSION['SESS_IP']
&& strlen($policy["SESSION_IP_MASK"]) > 0
&& (
(ip2long($policy["SESSION_IP_MASK"]) & ip2long($_SESSION['SESS_IP']))
!=
(ip2long($policy["SESSION_IP_MASK"]) & ip2long($remoteAddress))
);
// session timeout
if (!$destroySession)
$destroySession = $policy["SESSION_TIMEOUT"] > 0
&& $_SESSION['SESS_TIME'] > 0
&& $currentTime - $policy["SESSION_TIMEOUT"] * 60 > $_SESSION['SESS_TIME'];
// session expander control
if (!$destroySession)
$destroySession = $_SESSION["BX_SESSION_TERMINATE_TIME"] > 0
&& $currentTime > $_SESSION["BX_SESSION_TERMINATE_TIME"];
if ($destroySession)
{
$_SESSION = array();
@session_destroy();
//session_destroy cleans user session handles in some PHP versions
//see http://bugs.php.net/bug.php?id=32330 discussion
if (
ConfigOption::get("security", "session", "N") === "Y"
&& MainLoader::includeModule("security"))
{
CSecuritySession::init();
}
session_id(md5(uniqid(rand(), true)));
session_start();
}
$_SESSION['SESS_IP'] = $remoteAddress;
$_SESSION['SESS_TIME'] = time();
//session control from security module
if (
(ConfigOption::get("main", "use_session_id_ttl", "N") == "Y")
&& (intval(ConfigOption::get("main", "session_id_ttl", 0)) > 0)
&& !defined("BX_SESSION_ID_CHANGE")
)
{
if (!array_key_exists('SESS_ID_TIME', $_SESSION))
{
$_SESSION['SESS_ID_TIME'] = $_SESSION['SESS_TIME'];
}
elseif (($_SESSION['SESS_ID_TIME'] + intval(ConfigOption::get("main", "session_id_ttl"))) < $_SESSION['SESS_TIME'])
{
if (ConfigOption::get("security", "session", "N") === "Y"
&& BitrixMainLoader::includeModule("security"))
{
CSecuritySession::updateSessID();
}
else
{
session_regenerate_id();
}
$_SESSION['SESS_ID_TIME'] = $_SESSION['SESS_TIME'];
}
}
return !$destroySession;
}