Sicherheit: Passkey-Registrierung nur mit Freigabe durch Superadmin
authServer.php nahm getCreateArgs/processCreate ohne jede Pruefung an und uebernahm die Benutzer-id aus der URL. Jeder konnte damit aus dem Internet einen Passkey fuer ein beliebiges Konto (auch Superadmin) registrieren und sich anschliessend anmelden. - sites/userkeys.php loest den addKey ein und legt eine Freigabe in der Session ab (5 Minuten, ein Benutzer, einmalig); der addKey wird geloescht - authServer.php verlangt fuer getCreateArgs/processCreate Login, Superadmin-Recht und diese Freigabe; die Benutzer-id kommt aus der Freigabe, nicht aus der URL - queryFidoMetaDataService nur fuer Superadmins - Passkey-Login verweigert gesperrte Benutzer und meldet keinen Erfolg mehr, wenn der Benutzer fehlt - addKey.php verlangt wie userkeys.php das Superadmin-Recht - session_regenerate_id() nach Passwort- und Passkey-Login - userkeys.php/addKey.php: $_GET["id"] als int statt ungequotet in SQL Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -20,6 +20,8 @@ if(isset($_GET["formsent"]) && $_SESSION["login"] != "valid" && isLocal())
|
||||
if(mysqli_num_rows($qry) == 1)
|
||||
{
|
||||
$udata = mysqli_fetch_assoc($qry);
|
||||
// neue Session-ID nach dem Login, sonst ist Session-Fixation möglich
|
||||
session_regenerate_id(true);
|
||||
$_SESSION["login"] = "valid";
|
||||
$_SESSION["logedout"] = $udata["logedout"];
|
||||
$_SESSION["user"] = $udata["id"];
|
||||
|
||||
+8
-3
@@ -2,7 +2,12 @@
|
||||
|
||||
|
||||
if(isset($_GET["id"]) && isset($_GET["addKey"])){
|
||||
if (checkAdduser($_GET["addUser"])) {
|
||||
if (checkAdduser()) {
|
||||
// Freigabe einlösen: gilt 5 Minuten, nur für diesen Benutzer und nur
|
||||
// in dieser Session (geprüft in authServer.php). Der addKey ist damit
|
||||
// verbraucht.
|
||||
$_SESSION["passkey_freigabe"] = array("user" => (int)$_GET["id"], "bis" => time() + 300);
|
||||
mysqli_query($mysql, "DELETE FROM addKey WHERE accesskey = '".mysqli_real_escape_string($mysql, $_GET["addKey"])."'");
|
||||
echo <<<ENDE
|
||||
<html>
|
||||
<head></head>
|
||||
@@ -73,11 +78,11 @@ if(isset($_GET["id"]) && isset($_GET["addKey"])){
|
||||
$smarty->assign("heading","Passkeys für externen Zugang verwalten");
|
||||
$smarty->display("heading.tpl");
|
||||
|
||||
$qry = mysqli_query($_SESSION["dbconn"],"SELECT id, vname, nname FROM user WHERE blocked = 0 AND user.id = ".mysqli_real_escape_string($_SESSION["dbconn"],$_GET["id"])) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"]));
|
||||
$qry = mysqli_query($_SESSION["dbconn"],"SELECT id, vname, nname FROM user WHERE blocked = 0 AND user.id = ".(int)$_GET["id"]) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"]));
|
||||
$row=mysqli_fetch_array($qry);
|
||||
$smarty->assign("user",$row);
|
||||
|
||||
$qry = mysqli_query($_SESSION["dbconn"],"SELECT passkeys.id , passkeys.name FROM user JOIN passkeys ON user.id = passkeys.userId WHERE blocked = 0 AND user.id = ".mysqli_real_escape_string($_SESSION["dbconn"],$_GET["id"])) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"]));
|
||||
$qry = mysqli_query($_SESSION["dbconn"],"SELECT passkeys.id , passkeys.name FROM user JOIN passkeys ON user.id = passkeys.userId WHERE blocked = 0 AND user.id = ".(int)$_GET["id"]) or die("Datenbank fehler: ".mysqli_error($_SESSION["dbconn"]));
|
||||
$keys = array();
|
||||
while($row=mysqli_fetch_array($qry)){
|
||||
$keys[] = $row;
|
||||
|
||||
Reference in New Issue
Block a user