- 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>
93 lines
4.1 KiB
PHP
93 lines
4.1 KiB
PHP
<?php
|
|
|
|
|
|
if(isset($_GET["id"]) && isset($_GET["addKey"])){
|
|
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);
|
|
db_abfrage($mysql, "DELETE FROM addKey WHERE accesskey = ?", array((int)$_GET["addKey"]));
|
|
echo <<<ENDE
|
|
<html>
|
|
<head></head>
|
|
<body onload="createRegistration()">
|
|
</body>
|
|
<script src="js/auth.js"></script>
|
|
<script>
|
|
async function createRegistration() {
|
|
try {
|
|
// check browser support
|
|
if (!window.fetch || !navigator.credentials || !navigator.credentials.create) {
|
|
throw new Error('Browser not supported.');
|
|
}
|
|
let keyName = encodeURIComponent(prompt('Bitte Hier den Namen des Schlüssels eingeben:'));
|
|
const para = new URLSearchParams(window.location.search);
|
|
let userId = para.get('id');
|
|
// get create args
|
|
let rep = await window.fetch('authServer.php?fn=getCreateArgs', {method:'GET', cache:'no-cache'});
|
|
//alert(await rep.text());
|
|
const createArgs = await rep.json();
|
|
// error handling
|
|
if (createArgs.success === false) {
|
|
throw new Error(createArgs.msg || 'unknown error occured');
|
|
}
|
|
|
|
// replace binary base64 data with ArrayBuffer. a other way to do this
|
|
// is the reviver function of JSON.parse()
|
|
recursiveBase64StrToArrayBuffer(createArgs);
|
|
|
|
// create credentials
|
|
const cred = await navigator.credentials.create(createArgs);
|
|
|
|
// create object
|
|
const authenticatorAttestationResponse = {
|
|
transports: cred.response.getTransports ? cred.response.getTransports() : null,
|
|
clientDataJSON: cred.response.clientDataJSON ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
|
|
attestationObject: cred.response.attestationObject ? arrayBufferToBase64(cred.response.attestationObject) : null
|
|
};
|
|
|
|
// check auth on server side
|
|
rep = await window.fetch('authServer.php?fn=processCreate&id='+userId+'&name='+keyName, {
|
|
method : 'POST',
|
|
body : JSON.stringify(authenticatorAttestationResponse),
|
|
cache : 'no-cache'
|
|
});
|
|
authenticatorAttestationServerResponse = await rep.json();
|
|
// prompt server response
|
|
if (authenticatorAttestationServerResponse.success) {
|
|
window.alert(authenticatorAttestationServerResponse.msg || 'registration success');
|
|
if(!authenticatorAttestationServerResponse.msg){
|
|
window.location.href = "https://wm.el-wa.org/kunden";
|
|
}
|
|
|
|
} else {
|
|
throw new Error(authenticatorAttestationServerResponse.msg);
|
|
}
|
|
|
|
} catch (err) {
|
|
window.alert(err.message || 'unknown error occured');
|
|
}
|
|
}
|
|
</script>
|
|
</html>
|
|
ENDE;
|
|
}
|
|
}
|
|
|
|
$smarty->assign("heading","Passkeys für externen Zugang verwalten");
|
|
$smarty->display("heading.tpl");
|
|
|
|
$row = db_zeile($dbconn, "SELECT id, vname, nname FROM user WHERE blocked = 0 AND user.id = ?", array($_GET["id"]));
|
|
if($row === false)
|
|
die("Datenbank fehler: ".mysqli_error($dbconn));
|
|
$smarty->assign("user",$row);
|
|
|
|
$keys = db_zeilen($dbconn, "SELECT passkeys.id, passkeys.name FROM user JOIN passkeys ON user.id = passkeys.userId WHERE blocked = 0 AND user.id = ?", array($_GET["id"]));
|
|
if($keys === false)
|
|
die("Datenbank fehler: ".mysqli_error($dbconn));
|
|
$smarty->assign("keys",$keys);
|
|
$smarty->assign("local",isLocal());
|
|
$smarty->display("userkeys.tpl");
|
|
$_SESSION["camefrom"] ="userkeys";
|
|
?>
|