authServer.php: Passkey-Registrierung gegen fremde Aufrufe absichern
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>
This commit is contained in:
+18
-2
@@ -35,12 +35,28 @@
|
||||
*/
|
||||
|
||||
require_once './restricted/WebAuthn/src/WebAuthn.php';
|
||||
require_once("./restricted/mysql.php");
|
||||
require_once("./helper.php"); // startet die Session, liefert isLocal() und mysql.php
|
||||
try {
|
||||
session_start();
|
||||
|
||||
// read get argument and post body
|
||||
$fn = filter_input(INPUT_GET, 'fn');
|
||||
|
||||
// Registrierung und Loeschen von Anmeldedaten nur nach einem gueltigen
|
||||
// Einmalschluessel aus addUser.php (checkAdduser setzt mayRegister) oder
|
||||
// aus dem lokalen Netz. Ohne diese Wache genuegen zwei Aufrufe von
|
||||
// beliebiger Stelle, um einen eigenen Passkey fuer das fest hinterlegte
|
||||
// Konto anzulegen - der Einmalschluessel schuetzte nur die Anzeige in
|
||||
// index.php, nicht diesen Endpunkt.
|
||||
if ($fn === 'getCreateArgs' || $fn === 'processCreate' || $fn === 'clearRegistrations') {
|
||||
$freigegeben = isset($_SESSION['mayRegister'])
|
||||
&& (time() - $_SESSION['mayRegister']) < 600;
|
||||
if (!$freigegeben && !isLocal()) {
|
||||
http_response_code(403);
|
||||
header('Content-Type: application/json');
|
||||
print(json_encode(['success' => false, 'msg' => 'Registrierung nicht freigegeben.']));
|
||||
exit;
|
||||
}
|
||||
}
|
||||
$requireResidentKey = false;
|
||||
$userVerification = false;
|
||||
$formats = [];
|
||||
|
||||
@@ -59,6 +59,10 @@ function checkAdduser(){
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user