0 && strncmp($adresse, $netz, $ganzeBytes) !== 0) { return false; } if ($restBits === 0) { return true; } $maske = chr((0xFF << (8 - $restBits)) & 0xFF); return ($adresse[$ganzeBytes] & $maske) === ($netz[$ganzeBytes] & $maske); } /** * Kommt die Anfrage aus dem Heimnetz? Nur dann gilt sie ohne Anmeldung als * berechtigt. * * REMOTE_ADDR stammt aus der TCP-Verbindung und ist nicht faelschbar. * Weiterleitungs-Header wie X-Forwarded-For duerfen hier bewusst NICHT * herangezogen werden - sie kann jeder Aufrufer frei setzen. */ function isLocal() { $_SESSION["local"] = false; $remote = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; $server = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : ''; if (filter_var($remote, FILTER_VALIDATE_IP) === false) { return false; } // Auf IPv6 abgebildete IPv4-Adressen (::ffff:192.168.179.44) auf ihre // IPv4-Form zurueckfuehren. Ein Server mit Dual-Stack-Socket meldet // LAN-Clients so - ohne diesen Schritt faellt das Heimnetz durch. if (preg_match('/^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/i', $remote, $treffer)) { $remote = $treffer[1]; } $lokal = false; foreach (LOCAL_NETWORKS as $netz) { if (ipInNetwork($remote, $netz)) { $lokal = true; break; } } // Gleiches IPv6-/64 wie der Server. Das Praefix vergibt der Provider und // es kann sich aendern, deshalb aus SERVER_ADDR abgeleitet statt fest. if (!$lokal && filter_var($remote, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false && filter_var($server, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) { $lokal = substr(inet_pton($remote), 0, 8) === substr(inet_pton($server), 0, 8); } $_SESSION["local"] = $lokal; return $lokal; } /** * Kleine HTTP-GET-Anfrage im Heimnetz, Antwort als JSON-Array. * Ersetzt die frueher in carOG.php, heater.php und AutoAction.php je einzeln * definierte Funktion getSSLPage(). */ function httpGetJson($url){ $curlSession = curl_init(); curl_setopt($curlSession, CURLOPT_URL, $url); curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true); curl_setopt($curlSession, CURLOPT_TIMEOUT, 5); $response = curl_exec($curlSession); curl_close($curlSession); return json_decode($response, true); } function checkLogin(){ $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(){ $mysql = new mysqli($GLOBALS["mysql_server"],$GLOBALS["mysql_user"],$GLOBALS["mysql_pass"],$GLOBALS["mysql_db"]); if(!mysqli_query($mysql,"DELETE FROM addUser WHERE datetime < DATE_SUB(NOW(), INTERVAL 1 MINUTE);")){ echo mysqli_error($mysql); } $result = mysqli_query($mysql,"SELECT * FROM addUser WHERE accesskey='".mysqli_real_escape_string($mysql,$_GET["addUser"])."';"); if(!$result){ return false; } if ($result->num_rows > 0) { // Freigabe fuer die Passkey-Registrierung vermerken. authServer.php // prueft dieses Merkmal; ohne das waeren getCreateArgs/processCreate // direkt aufrufbar und der Einmalschluessel wirkungslos. $_SESSION["mayRegister"] = time(); return true; } return false; } ?>