Files
Kundenverwaltung/sites/start.php
T
adminandClaude Opus 5 a6758ae63b 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>
2026-09-17 10:09:54 +02:00

79 lines
3.5 KiB
PHP

<?php
if(!isset($_POST["user"]))
$_POST["user"] = "";
else
$_POST["user"] = htmlspecialchars($_POST["user"]);
if(!isset($_POST["pass"]))
$_POST["pass"] = "";
else
$_POST["pass"] = htmlspecialchars($_POST["pass"]);
$smarty->display("heading.tpl");
$smarty->assign("local",isLocal());
if(isset($_GET["formsent"]) && $_SESSION["login"] != "valid" && isLocal())
{
$qry= mysqli_query($dbconn, "SELECT salt FROM user WHERE LOWER(nick) = '".mysql_escape_string(strtolower($_POST["user"]))."' AND blocked = 0") or error("Es ist ein Fehler in der abfrage der Benutzerdaten: <br />".formaterror(mysqli_error($dbconn)));
if(mysqli_num_rows($qry) == 1)
{
$res = mysqli_fetch_array($qry);
$qry= mysqli_query($dbconn, "SELECT * FROM user WHERE nick = '".mysql_escape_string($_POST["user"])."' AND pass = '".crypt($_POST["pass"],$res[0])."'") or error("Es ist ein Fehler in der abfrage der Benutzerdaten: <br />".formaterror(mysqli_error($dbconn)));
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"];
$_SESSION["nick"] = $udata["nick"];
$_SESSION["vname"] = $udata["vname"];
$_SESSION["nname"] = $udata["nname"];
$_SESSION["rights"] = $udata["rights"];
$_SESSION["lastlogin"] = $udata["lastlogin"];
$_SESSION["numlogins"] = $udata["numlogins"];
$_SESSION["style"] = getUserSetting($dbconn,"style", $udata["id"]);
if(!is_file("styles/".$_SESSION["style"]))
{
updateUserSetting($dbconn,"style", "default.css", $udata["id"]);
$_SESSION["style"] = getUserSetting($dbconn,"style", $udata["id"]);
}
$_SESSION["zoom"] = getUserSetting($dbconn,"zoom", $_SESSION["user"], 1);
$_SESSION["privateNotes"] = getUserSetting($dbconn,"privnotes", $_SESSION["user"], "");
mysqli_query($dbconn, "UPDATE user SET wrongpw = 0, lastlogin = NOW(), numlogins = numlogins + 1, logedout = 0 WHERE nick = '".mysql_escape_string($_POST["user"])."'");
}
else
{
$qry= mysqli_query($dbconn, "SELECT wrongpw FROM user WHERE nick = '".mysql_escape_string($_POST["user"])."'") or error("Es ist ein Fehler in der abfrage der Benutzerdaten: <br />".formaterror(mysqli_error($dbconn)));;
if(mysqli_num_rows($qry))
{
$wrongpw = mysqli_fetch_array($qry);
if($wrongpw[0] < 10)
{
mysqli_query($dbconn, "UPDATE user SET wrongpw = wrongpw + 1 WHERE nick = '".mysql_escape_string($_POST["user"])."'");
$triesleft = 10 - $wrongpw[0];
if($triesleft > 1)
error("Der Benuzername oder das Passwort sind falsch, bitte versuchen Sie es erneut (Nach weiteren $triesleft Versuchen wird der Benutzer deaktiviert und muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.)");
else
error("Der Benuzername oder das Passwort sind falsch, bitte versuchen Sie es erneut (Wenn der nächste Versuch falsch ist, wird der Benutzer für deaktiviert und muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.)");
}
else
{
mysqli_query($dbconn, "UPDATE user SET blocked = 1 WHERE nick = '".mysql_escape_string($_POST["user"])."'");
error("Der Benuzer wurde deaktiviert, er muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.");
}
}
}
}
else
error("Dieser Benutzername existiert nicht.");
}
if($_SESSION["login"]=="valid"){
header('Location:?action=kunden');
}
else{
$smarty->display("start.tpl");
}
?>