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; } /* Ist $_GET["addKey"] eine gültige, höchstens eine Minute alte Freigabe? */ function checkAdduser(){ global $mysql; db_abfrage($mysql, "DELETE FROM addKey WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE)") or print(mysqli_error($mysql)); // Nur reine Ziffern: accesskey ist eine Zahlenspalte, MariaDB würde // "12345678xyz" beim Vergleich stillschweigend zu 12345678 machen. $key = $_GET["addKey"] ?? ""; if(!is_string($key) || !ctype_digit($key)) return false; $anzahl = db_wert($mysql, "SELECT COUNT(*) FROM addKey WHERE accesskey = ?", array((int)$key)); return $anzahl > 0; } ?>