diff --git a/config.dist.php b/config.dist.php index dd5993df69a07df655ae00ccc774177a649354d7..f7fea75f7fd5934ffe6edac2c0d10029faac6fe2 100755 --- a/config.dist.php +++ b/config.dist.php @@ -30,7 +30,6 @@ $db['webhost'] = ''; Please update these settings before setting 'ssl' to true. All settings can be commented out or set to NULL if not needed - php 5.3.7 required ******************************/ $db['ssl'] = false; // true/false, enable or disable SSL as a whole // $db['ssl_key'] = '/path/to/cert.key'; // path to an SSL key file. Only makes sense combined with ssl_cert @@ -43,6 +42,21 @@ $db['ssl'] = false; // true/false, enable or $db['tmptable_engine_type'] = "MEMORY"; // Temporary table type to construct complex queries (MEMORY, InnoDB) $db['use_cte'] = 1; // Use recursive CTE queries [>=MariaDB 10.2.2, >=MySQL 8.0] (0=disabled, 1=autodetect, 2=force enable) +/** + * Reverse proxy settings + * + * If operating behind a reverse proxy set $trust_x_forwarded_headers=true; to accept the following headers + * + * WARNING! These headers shoud be filtered and/or overwritten by the reverse-proxy to avoid potential abuse by end-clients. + * + * X_FORDWARDED_FOR + * X_FORDWARDED_HOST + * X_FORDWARDED_PORT + * X_FORDWARDED_PROTO + * X_FORDWARDED_SSL + * X_FORWARDED_URI + */ +$trust_x_forwarded_headers = false; /** * Mail sending and other parameters for pingCheck and DiscoveryCheck scripts diff --git a/config.docker.php b/config.docker.php index f76b837764ac941d69295c922008c2a4ec611851..245b0027adf15777fa635b467dbe3f030567393c 100644 --- a/config.docker.php +++ b/config.docker.php @@ -48,6 +48,22 @@ $db['name'] = file_env('IPAM_DATABASE_NAME', $db['name']); $db['port'] = file_env('IPAM_DATABASE_PORT', $db['port']); $db['webhost'] = file_env('IPAM_DATABASE_WEBHOST', $db['webhost']); +/** + * Reverse proxy settings + * + * If operating behind a reverse proxy set IPAM_TRUST_X_FORWARDED=true to accept the following headers + * + * WARNING! These headers shoud be filtered and/or overwritten by the reverse-proxy to avoid potential abuse by end-clients. + * + * X_FORDWARDED_FOR + * X_FORDWARDED_HOST + * X_FORDWARDED_PORT + * X_FORDWARDED_PROTO + * X_FORDWARDED_SSL + * X_FORWARDED_URI + */ +$trust_x_forwarded_headers = filter_var(file_env('IPAM_TRUST_X_FORWARDED', $trust_x_forwarded_headers), FILTER_VALIDATE_BOOLEAN); + /** * proxy connection details ******************************/ @@ -82,3 +98,9 @@ $cookie_samesite = file_env('COOKIE_SAMESITE', $cookie_samesite); * @var string */ $session_storage = "database"; + + +/** + * General tweaks + ******************************/ +$config['footer_message'] = file_env('IPAM_FOOTER_MESSAGE', $config['footer_message']); diff --git a/functions/classes/class.Common.php b/functions/classes/class.Common.php index 643b7e68106b37c9668d333c791407da998f58a9..83684007febc524ebab6469988b7d0fed85eb171 100644 --- a/functions/classes/class.Common.php +++ b/functions/classes/class.Common.php @@ -997,19 +997,20 @@ class Common_functions { * @return int */ private function httpPort() { - // If only HTTP_X_FORWARDED_PROTO='https' is set assume port=443. Override if required by setting HTTP_X_FORWARDED_PORT - if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && !isset($_SERVER['HTTP_X_FORWARDED_PORT'])) { - return ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') ? 443 : 80; - } - elseif (isset($_SERVER['HTTP_X_FORWARDED_PORT'])) { - return $_SERVER['HTTP_X_FORWARDED_PORT']; + if (Config::ValueOf('trust_x_forwarded_headers') === true) { + // If only HTTP_X_FORWARDED_PROTO='https' is set assume port=443. Override if required by setting HTTP_X_FORWARDED_PORT + if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && !isset($_SERVER['HTTP_X_FORWARDED_PORT'])) { + return ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') ? 443 : 80; + } + if (isset($_SERVER['HTTP_X_FORWARDED_PORT'])) { + return $_SERVER['HTTP_X_FORWARDED_PORT']; + } } - elseif (isset($_SERVER['SERVER_PORT'])) { + if (isset($_SERVER['SERVER_PORT'])) { return $_SERVER['SERVER_PORT']; } - else { - return 80; - } + + return 80; } /** @@ -1019,21 +1020,22 @@ class Common_functions { * @return bool */ public function isHttps () { - if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) { - return ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'); - } - elseif (isset($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') { - return true; + if (Config::ValueOf('trust_x_forwarded_headers') === true) { + if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) { + return ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'); + } + if (isset($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') { + return true; + } } - elseif(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { + if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { return true; } - elseif($this->httpPort() == 443) { + if ($this->httpPort() == 443) { return true; } - else { - return false; - } + + return false; } /** @@ -1045,8 +1047,11 @@ class Common_functions { if (php_sapi_name() === "cli") return null; - if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP)) - return $_SERVER['HTTP_X_FORWARDED_FOR']; + if (Config::ValueOf('trust_x_forwarded_headers') === true) { + if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && filter_var($_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP)) { + return $_SERVER['HTTP_X_FORWARDED_FOR']; + } + } if (isset($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) return $_SERVER['REMOTE_ADDR']; @@ -1063,16 +1068,13 @@ class Common_functions { public function createURL () { $proto = $this->isHttps() ? 'https' : 'http'; - if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { + if (Config::ValueOf('trust_x_forwarded_headers') === true && isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { $url = $_SERVER['HTTP_X_FORWARDED_HOST']; - } - elseif (isset($_SERVER['HTTP_HOST'])) { + } elseif (isset($_SERVER['HTTP_HOST'])) { $url = $_SERVER['HTTP_HOST']; - } - elseif (isset($_SERVER['SERVER_NAME'])) { + } elseif (isset($_SERVER['SERVER_NAME'])) { $url = $_SERVER['SERVER_NAME']; - } - else { + } else { $url = "localhost"; } $host = parse_url("$proto://$url", PHP_URL_HOST) ?: "localhost"; diff --git a/functions/classes/class.User.php b/functions/classes/class.User.php index 263af2bde30c40232c8f65b8830b059da7082201..8343b94d6221f7a403f8d60a0a5ffa1f452e2a73 100644 --- a/functions/classes/class.User.php +++ b/functions/classes/class.User.php @@ -511,8 +511,7 @@ class User extends Common_functions { return; } } - - if (isset($_SERVER['HTTP_X_FORWARDED_URI'])) { + if (Config::ValueOf('trust_x_forwarded_headers') === true && isset($_SERVER['HTTP_X_FORWARDED_URI'])) { $uri = $_SERVER['HTTP_X_FORWARDED_URI']; } elseif (isset($_SERVER['REQUEST_URI'])) { diff --git a/misc/CHANGELOG b/misc/CHANGELOG index 3b1eb54d779a661b5f38bc6f8c73b9ad48931537..27b575cfe3ee400601bbba372891598fb02cc0cf 100755 --- a/misc/CHANGELOG +++ b/misc/CHANGELOG @@ -2,8 +2,9 @@ Enhancements, changes: ---------------------------- - + php8.4 compatibility; + + php8.3 compatibility; + MySQL 5.5.3+ is now required (support for utf8mb4); + + Reverse-proxy users should review the new config.php $trust_x_forwarded_headers setting; Security Fixes: ----------------------------