Fix IPv6 address in cookie domain (#1137)
* Implement getCookieHost to extract cookie host from HTTP_HOST
This commit is contained in:
@@ -87,16 +87,38 @@ class UI
|
|||||||
|
|
||||||
return $isHttps && (strcasecmp('on', $isHttps) == 0 || strcasecmp('https', $isHttps) == 0);
|
return $isHttps && (strcasecmp('on', $isHttps) == 0 || strcasecmp('https', $isHttps) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract the cookie host from HTTP_HOST, stripping the port.
|
||||||
|
*/
|
||||||
|
public static function getCookieHost(): ?string
|
||||||
|
{
|
||||||
|
if (empty($_SERVER['HTTP_HOST']))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
$colonPosition = strrpos($_SERVER['HTTP_HOST'], ':');
|
||||||
|
// There's no port in the host
|
||||||
|
if ($colonPosition === false)
|
||||||
|
return $_SERVER['HTTP_HOST'];
|
||||||
|
|
||||||
|
$closingSquareBracketPosition = strrpos($_SERVER['HTTP_HOST'], ']');
|
||||||
|
// The host is an IPv4 address or hostname with port
|
||||||
|
if ($closingSquareBracketPosition === false)
|
||||||
|
return substr($_SERVER['HTTP_HOST'], 0, $colonPosition);
|
||||||
|
|
||||||
|
// The host is an IPv6 address with port
|
||||||
|
return substr($_SERVER['HTTP_HOST'], 0, $closingSquareBracketPosition + 1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* send various security related headers
|
* send various security related headers
|
||||||
*/
|
*/
|
||||||
public static function sendHeaders()
|
public static function sendHeaders()
|
||||||
{
|
{
|
||||||
$cookie_host = empty($_SERVER['HTTP_HOST']) ? null : explode (':', $_SERVER['HTTP_HOST'])[0];
|
|
||||||
session_set_cookie_params([
|
session_set_cookie_params([
|
||||||
'lifetime' => self::$install_mode ? 7200 : 600, // will be renewed based on settings in lib/init.php
|
'lifetime' => self::$install_mode ? 7200 : 600, // will be renewed based on settings in lib/init.php
|
||||||
'path' => '/',
|
'path' => '/',
|
||||||
'domain' => $cookie_host,
|
'domain' => self::getCookieHost(),
|
||||||
'secure' => self::requestIsHttps(),
|
'secure' => self::requestIsHttps(),
|
||||||
'httponly' => true,
|
'httponly' => true,
|
||||||
'samesite' => 'Strict'
|
'samesite' => 'Strict'
|
||||||
|
|||||||
@@ -331,11 +331,10 @@ if (CurrentUser::hasSession()) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// update cookie lifetime
|
// update cookie lifetime
|
||||||
$cookie_host = empty($_SERVER['HTTP_HOST']) ? null : explode (':', $_SERVER['HTTP_HOST'])[0];
|
|
||||||
$cookie_params = [
|
$cookie_params = [
|
||||||
'expires' => time() + Settings::Get('session.sessiontimeout'),
|
'expires' => time() + Settings::Get('session.sessiontimeout'),
|
||||||
'path' => '/',
|
'path' => '/',
|
||||||
'domain' => $cookie_host,
|
'domain' => UI::getCookieHost(),
|
||||||
'secure' => UI::requestIsHttps(),
|
'secure' => UI::requestIsHttps(),
|
||||||
'httponly' => true,
|
'httponly' => true,
|
||||||
'samesite' => 'Strict'
|
'samesite' => 'Strict'
|
||||||
|
|||||||
Reference in New Issue
Block a user