You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							152 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
	
	
							152 lines
						
					
					
						
							3.9 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
$check_csrf = true;
 | 
						|
 | 
						|
if (
 | 
						|
	$_SERVER["SCRIPT_FILENAME"] == "/usr/local/hestia/web/inc/mail-wrapper.php" ||
 | 
						|
	$_SERVER["SCRIPT_FILENAME"] == "/usr/local/hestia//web/inc/mail-wrapper.php"
 | 
						|
) {
 | 
						|
	$check_csrf = false;
 | 
						|
} // execute only from CLI
 | 
						|
if (
 | 
						|
	$_SERVER["SCRIPT_FILENAME"] == "/usr/local/hestia/web/reset/mail/index.php" ||
 | 
						|
	$_SERVER["SCRIPT_FILENAME"] == "/usr/local/hestia/web//reset/mail/index.php"
 | 
						|
) {
 | 
						|
	$check_csrf = false;
 | 
						|
} // Localhost only
 | 
						|
if (
 | 
						|
	$_SERVER["SCRIPT_FILENAME"] == "/usr/local/hestia/web/api/index.php" ||
 | 
						|
	$_SERVER["SCRIPT_FILENAME"] == "/usr/local/hestia/web//api/index.php"
 | 
						|
) {
 | 
						|
	$check_csrf = false;
 | 
						|
} // Own check
 | 
						|
if (substr($_SERVER["SCRIPT_FILENAME"], 0, 22) == "/usr/local/hestia/bin/") {
 | 
						|
	$check_csrf = false;
 | 
						|
}
 | 
						|
 | 
						|
function checkStrictness($level) {
 | 
						|
	if ($level >= $_SESSION["POLICY_CSRF_STRICTNESS"]) {
 | 
						|
		return true;
 | 
						|
	} else {
 | 
						|
		http_response_code(400);
 | 
						|
		echo "<h1>Potential CSRF use detected</h1>\n" .
 | 
						|
			"<p>Please disable any plugins/add-ons inside your browser or contact your system administrator. If you are the system administrator you can run v-change-sys-config-value 'POLICY_CSRF_STRICTNESS' '0' as root to disable this check.<p>" .
 | 
						|
			"<p>If you followed a bookmark or an static link please <a href='/'>navigate to root</a>";
 | 
						|
		die();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function prevent_post_csrf() {
 | 
						|
	if (!empty($_SERVER["REQUEST_METHOD"])) {
 | 
						|
		if ($_SERVER["REQUEST_METHOD"] === "POST") {
 | 
						|
			if (!empty($_SERVER["HTTP_HOST"])) {
 | 
						|
				$hostname = preg_replace(
 | 
						|
					"/(\[?[^]]*\]?):([0-9]{1,5})$/",
 | 
						|
					"$1",
 | 
						|
					$_SERVER["HTTP_HOST"],
 | 
						|
				);
 | 
						|
				$port_is_defined = preg_match("/\[?[^]]*\]?:[0-9]{1,5}$/", $_SERVER["HTTP_HOST"]);
 | 
						|
				if ($port_is_defined) {
 | 
						|
					$port = preg_replace(
 | 
						|
						"/(\[?[^]]*\]?):([0-9]{1,5})$/",
 | 
						|
						"$2",
 | 
						|
						$_SERVER["HTTP_HOST"],
 | 
						|
					);
 | 
						|
				} else {
 | 
						|
					$port = 443;
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				$hostname = gethostname();
 | 
						|
				$port = 443;
 | 
						|
			}
 | 
						|
			if (isset($_SERVER["HTTP_ORIGIN"])) {
 | 
						|
				$origin_host = parse_url($_SERVER["HTTP_ORIGIN"], PHP_URL_HOST);
 | 
						|
				if (
 | 
						|
					strcmp($origin_host, gethostname()) === 0 &&
 | 
						|
					in_array($port, ["443", $_SERVER["SERVER_PORT"]])
 | 
						|
				) {
 | 
						|
					return checkStrictness(2);
 | 
						|
				} else {
 | 
						|
					if (
 | 
						|
						strcmp($origin_host, $hostname) === 0 &&
 | 
						|
						in_array($port, ["443", $_SERVER["SERVER_PORT"]])
 | 
						|
					) {
 | 
						|
						return checkStrictness(1);
 | 
						|
					} else {
 | 
						|
						return checkStrictness(0);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function prevent_get_csrf() {
 | 
						|
	if (!empty($_SERVER["REQUEST_METHOD"])) {
 | 
						|
		if ($_SERVER["REQUEST_METHOD"] === "GET") {
 | 
						|
			if (!empty($_SERVER["HTTP_HOST"])) {
 | 
						|
				$hostname = preg_replace(
 | 
						|
					"/(\[?[^]]*\]?):([0-9]{1,5})$/",
 | 
						|
					"$1",
 | 
						|
					$_SERVER["HTTP_HOST"],
 | 
						|
				);
 | 
						|
				$port_is_defined = preg_match("/\[?[^]]*\]?:[0-9]{1,5}$/", $_SERVER["HTTP_HOST"]);
 | 
						|
				if ($port_is_defined) {
 | 
						|
					$port = preg_replace(
 | 
						|
						"/(\[?[^]]*\]?):([0-9]{1,5})$/",
 | 
						|
						"$2",
 | 
						|
						$_SERVER["HTTP_HOST"],
 | 
						|
					);
 | 
						|
				} else {
 | 
						|
					$port = 443;
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				$hostname = gethostname();
 | 
						|
				$port = 443;
 | 
						|
			}
 | 
						|
 | 
						|
			//list of possible entries route and these should never be blocked
 | 
						|
			if (
 | 
						|
				in_array($_SERVER["DOCUMENT_URI"], [
 | 
						|
					"/list/user/index.php",
 | 
						|
					"/login/index.php",
 | 
						|
					"/list/web/index.php",
 | 
						|
					"/list/dns/index.php",
 | 
						|
					"/list/mail/index.php",
 | 
						|
					"/list/db/index.php",
 | 
						|
					"/list/cron/index.php",
 | 
						|
					"/list/backup/index.php",
 | 
						|
					"/reset/index.php",
 | 
						|
				])
 | 
						|
			) {
 | 
						|
				return true;
 | 
						|
			}
 | 
						|
			if (isset($_SERVER["HTTP_REFERER"])) {
 | 
						|
				$referrer_host = parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST);
 | 
						|
				if (
 | 
						|
					strcmp($referrer_host, gethostname()) === 0 &&
 | 
						|
					in_array($port, ["443", $_SERVER["SERVER_PORT"]])
 | 
						|
				) {
 | 
						|
					return checkStrictness(2);
 | 
						|
				} else {
 | 
						|
					if (
 | 
						|
						strcmp($referrer_host, $hostname) === 0 &&
 | 
						|
						in_array($port, ["443", $_SERVER["SERVER_PORT"]])
 | 
						|
					) {
 | 
						|
						return checkStrictness(1);
 | 
						|
					} else {
 | 
						|
						return checkStrictness(0);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				return checkStrictness(0);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
if ($check_csrf == true) {
 | 
						|
	prevent_post_csrf();
 | 
						|
	prevent_get_csrf();
 | 
						|
}
 |