strlen($ipBin) * 8) return false; $bytes = intdiv($praefix, 8); if(substr($ipBin, 0, $bytes) !== substr($netzBin, 0, $bytes)) return false; $bits = $praefix % 8; if($bits == 0) return true; $maske = (0xFF << (8 - $bits)) & 0xFF; return (ord($ipBin[$bytes]) & $maske) == (ord($netzBin[$bytes]) & $maske); } /* * Kommt die Anfrage aus dem lokalen Netz? Davon hängen Passwort-Login und das * Vergeben von Passkeys ab. * * Maßgeblich ist $lokale_netze aus der externen Config, z.B. * $lokale_netze = array("192.168.179.0/24", "2001:db8:1:2::/64"); * Fehlt die Liste, gelten nur Geräte im selben IPv6-/64-Netz wie der Server. * * Das Docker-Netz darf dort nicht stehen: Anfragen, die über den Docker- * Proxy oder einen Reverse Proxy kommen, tragen dessen Adresse aus diesem * Netz - dann wäre jeder Zugriff aus dem Internet "lokal". */ function isLocal(){ global $lokale_netze; $_SESSION["local"] = false; // Über einen Proxy weitergereicht: REMOTE_ADDR ist dann die Adresse des // Proxys, nicht die des Browsers. Solche Anfragen sind nie lokal. foreach(array("HTTP_X_FORWARDED_FOR", "HTTP_X_REAL_IP", "HTTP_FORWARDED", "HTTP_X_FORWARDED_HOST", "HTTP_CLIENT_IP") as $kopf){ if(!empty($_SERVER[$kopf])) return false; } $remote = $_SERVER["REMOTE_ADDR"] ?? ""; $lokal = false; if(is_array($lokale_netze)){ foreach($lokale_netze as $netz){ if(ipImNetz($remote, $netz)){ $lokal = true; break; } } }else{ $server = $_SERVER["SERVER_ADDR"] ?? ""; $lokal = str_contains($server, ":") && !str_starts_with(strtolower($server), "fe80") && ipImNetz($remote, $server."/64"); } $_SESSION["local"] = $lokal; return $lokal; } function checkLogin(){ global $mysql; //$mysql = new mysqli($GLOBALS["mysql_server"],$GLOBALS["mysql_user"],$GLOBALS["mysql_pass"],$GLOBALS["mysql_db"]); if(isLocal()){ $_SESSION["local"] =true; return true; } if(isset($_SESSION["authKey"])){ $res = mysqli_query($mysql,"SELECT id FROM users WHERE lastAuth > DATE_SUB(NOW(), INTERVAL 2 DAY) AND authKey = '".mysqli_real_escape_string($mysql,$_SESSION["authKey"])."' AND name = '".mysqli_real_escape_string($mysql,$_SESSION["user"])."';"); if(!$res){ echo mysqli_error($mysql); return false; } if(mysqli_num_rows($res) == 1){ return isset($_SESSION["Logged"]); } }else{ return false; } } function checkAdduser(){ global $mysql; //$mysql = new mysqli($GLOBALS["mysql_server"],$GLOBALS["mysql_user"],$GLOBALS["mysql_pass"],$GLOBALS["mysql_db"]); if(!mysqli_query($mysql,"DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE);")){ echo mysqli_error($mysql); } $result = mysqli_query($mysql,"SELECT * FROM addKey WHERE accesskey='".mysqli_real_escape_string($mysql,$_GET["addKey"])."';"); if(!$result){ return false; } if ($result->num_rows > 0) { return true; } return false; } ?>