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:
2026-08-28 15:34:11 +02:00
co-authored by Claude Opus 5
parent 64445e95fe
commit 49ff6b5c0b
2 changed files with 22 additions and 2 deletions
+18 -2
View File
@@ -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 = [];
+4
View File
@@ -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;