Files
adminandClaude Opus 5 6306bfba17 Login und Passkeys auf Prepared Statements umgebaut
- sites/start.php: ein Query statt zwei, Passwortvergleich per hash_equals
  in PHP statt im SQL, Updates per id. Die Eingaben gehen nicht mehr durch
  htmlspecialchars(): Passwoerter werden beim Anlegen roh gehasht, mit
  & < > " ' konnte man sich deshalb bisher nie anmelden.
- getUserSetting/updateUserSetting mit Platzhaltern; behoben: INSERT-Zweig
  rief mysqli_real_escape_string ohne Verbindung auf (Fatal Error),
  $mysqli_error als Variable, ungewolltes echo "update". Aufrufer escapen
  nicht mehr vor (sonst doppelt), settings.php: Tippfehler
  mysqi_real_escape_string beim Speichern von show_sks behoben, style nur
  als Dateiname ohne Pfad.
- authServer.php, addKey.php, userkeys.php, checkAdduser(): Platzhalter.
  Passkey-INSERT setzt lastAuth/authKey (Pflichtfelder im strikten Modus).
  addKey nur als reine Ziffern, sonst passte "12345678xyz" per Typumwandlung.
- checkLogin() entfernt: nirgends aufgerufen, fragte die nicht existierende
  Tabelle users ab.
- userkeys.tpl: Passkey-Name escaped.

Getestet gegen die migrierte Testdatenbank im strikten Modus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 10:24:17 +02:00

63 lines
2.9 KiB
PHP

<?php
$smarty->display("heading.tpl");
$smarty->assign("local",isLocal());
if(isset($_GET["formsent"]) && $_SESSION["login"] != "valid" && isLocal())
{
// Eingaben unverändert verwenden: Passwörter werden beim Anlegen roh
// gehasht, ein htmlspecialchars() hier ließ Passwörter mit & < > " '
// nie passen. Ausgabe-Escaping übernimmt das Template.
$nick = isset($_POST["user"]) && is_string($_POST["user"]) ? $_POST["user"] : "";
$pass = isset($_POST["pass"]) && is_string($_POST["pass"]) ? $_POST["pass"] : "";
$udata = db_zeile($dbconn, "SELECT * FROM user WHERE nick = ? AND blocked = 0", array($nick));
if($udata === false)
error("Es ist ein Fehler in der abfrage der Benutzerdaten: <br />".formaterror(mysqli_error($dbconn)));
elseif($udata === null)
error("Dieser Benutzername existiert nicht.");
elseif(hash_equals($udata["pass"], crypt($pass, $udata["salt"])))
{
// 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"], "");
db_abfrage($dbconn, "UPDATE user SET wrongpw = 0, lastlogin = NOW(), numlogins = numlogins + 1, logedout = 0 WHERE id = ?", array($udata["id"]));
}
elseif($udata["wrongpw"] < 10)
{
db_abfrage($dbconn, "UPDATE user SET wrongpw = wrongpw + 1 WHERE id = ?", array($udata["id"]));
$triesleft = 10 - $udata["wrongpw"];
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
{
db_abfrage($dbconn, "UPDATE user SET blocked = 1 WHERE id = ?", array($udata["id"]));
error("Der Benuzer wurde deaktiviert, er muss vom Hauptbenutzer wieder aktiviert werden, damit er sich anmelden kann.");
}
}
if($_SESSION["login"]=="valid"){
header('Location:?action=kunden');
}
else{
$smarty->display("start.tpl");
}
?>