getCreateArgs und processCreate waren ohne jede Pruefung erreichbar. Der Einmalschluessel aus addUser.php steuerte nur, ob index.php die Registrierungsseite anzeigt - authServer.php liess sich direkt aufrufen und umging das. Da userId und userName fest hinterlegt sind, konnte damit jeder mit zwei Requests einen eigenen Passkey fuer das vorhandene Konto anlegen. checkAdduser() vermerkt eine erfolgreiche Schluesselpruefung jetzt als $_SESSION["mayRegister"]. authServer.php laesst getCreateArgs, processCreate und clearRegistrations nur noch durch, wenn dieser Vermerk hoechstens zehn Minuten alt ist oder der Aufruf aus dem lokalen Netz kommt. Anmeldung und Metadatenabfrage (getGetArgs, processGet, queryFidoMetaDataService) bleiben unveraendert offen. authServer.php bindet dafuer helper.php ein statt nur restricted/mysql.php; das eigene session_start() entfaellt, helper.php erledigt es. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
71 lines
2.6 KiB
PHP
71 lines
2.6 KiB
PHP
<?php
|
|
session_start();
|
|
require_once("restricted/mysql.php");
|
|
$_SESSION["local"] =false;
|
|
|
|
function isLocal(){
|
|
$ipv6_prefix = explode(":",$_SERVER['SERVER_ADDR'],5);
|
|
$ipv6 = explode(":",$_SERVER['REMOTE_ADDR'],5);
|
|
if(($ipv6_prefix[0] == $ipv6[0] && $ipv6_prefix[1] == $ipv6[1] && $ipv6_prefix[2] == $ipv6[2] && $ipv6_prefix[3] == $ipv6[3]) || str_starts_with($_SERVER['REMOTE_ADDR'],"192.168.179.")){
|
|
$_SESSION["local"] =true;
|
|
return true;
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
|
|
?>
|